Como registrar trabalhos cron?

218

Quero saber como posso ver exatamente o que os trabalhos cron estão fazendo em cada execução. Onde estão localizados os arquivos de log? Ou posso enviar a saída para o meu email? Eu configurei o endereço de email para enviar o log quando o trabalho cron for executado, mas ainda não recebi nada.

Adrian M.
fonte
Dê uma olhada nesta postagem: Gerenciando arquivos de log criados por tarefas cron .
codeforester

Respostas:

347
* * * * * myjob.sh >> /var/log/myjob.log 2>&1

registrará toda a saída do trabalho cron em /var/log/myjob.log

Você pode usar mailpara enviar e-mails. A maioria dos sistemas enviará crona saída do trabalho não tratado por email para o root ou o usuário correspondente.

Spliffster
fonte
78
Descrição do que significa 2>&1: stackoverflow.com/questions/818255/in-the-bash-shell-what-is-21
Yamaneko
5
qual seria o problema se esse arquivo de log nunca fosse criado?
clamp
10
FWIW, se você quiser os dois stderre stdoutno log, 2>&1isso deve ocorrer após o indireção:myjob.sh >> /var/log/myjob.log 2>&1
Dan Lecocq
2
Como inserir YYYY-MM-DD_hh-mm-secno nome do arquivo de saída, para que cada nome de arquivo seja diferente e mantido sem reescrever?
Danijel 11/01
6
@Danijel serverfault.com/a/117365/193377 0 0 * * * /some/path/to/a/file.php> $ HOME / date +\%Y\%m\%d\%H\%M\%S-cron.log 2> & 1
AnneTheAgile
61

Por padrão, o cron registra em / var / log / syslog para que você possa ver as entradas relacionadas ao cron usando:

grep CRON /var/log/syslog

/ubuntu/56683/where-is-the-cron-crontab-log

Matthew Lock
fonte
2
No ubuntu 12.04, o padrão é sem .log, ou seja, / var / log / syslog
tishma
5
uso journalctl | grep cronem sistemas systemd
Microsoft Linux TM
2
/var/log/cronno AWS Linux AMI.
Jonathan
2
ousudo journalctl -u cron
Gianfranco P.
2
Onde exatamente cronestá sendo registrado é muito dependente do sistema. Há uma resposta separada com detalhes sobre como vários destinos de log são configurados nos sistemas Linux (ou mais corretamente, nos sistemas que usam syslog). Outros sistemas podem ter uma maneira diferente de configurar essas coisas.
tripleee
10

Aqui está o meu código:

* * * * * your_script_fullpath >> your_log_path 2>&1
Haimei
fonte
">>" significa acrescentar dados ao arquivo? qual é o significado de "2> & 1", saída completa com erro, certo?
Nullpointer
3
As perguntas básicas de redirecionamento são mais bem verificadas no manual. Também há um conjunto de perguntas métricas sobre esses operadores aqui no Stack Overflow. Mas sim, aproximadamente; >>acrescenta e 2>&1diz para enviar erro padrão para o mesmo local da saída padrão.
Tripleee 23/10
10

Existem pelo menos três tipos diferentes de log:

  1. O log ANTES do programa é executado, que registra apenas se o cronjob TENTAR executar o comando. Esse está localizado em / var / log / syslog, como já mencionado por @Matthew Lock.

  2. O registro de erros APÓS o programa tentar executar, que pode ser enviado para um email ou arquivo, conforme mencionado pelo @Spliffster. Prefiro fazer logon em um arquivo, porque, com o email THEN, você tem uma NOVA fonte de problemas e verifica se o envio e a recepção de emails estão funcionando perfeitamente. Às vezes é, às vezes não é. Por exemplo, em uma máquina comum simples na qual você não está interessado em configurar um smtp, às vezes você prefere fazer logon em um arquivo:

     * * * *  COMMAND_ABSOLUTE_PATH > /ABSOLUTE_PATH_TO_LOG 2>&1
    
    • Também consideraria verificar as permissões de / ABSOLUTE_PATH_TO_LOG e executar o comando a partir das permissões desse usuário. Apenas para verificação, enquanto você testa se pode ser uma fonte potencial de problemas.
  3. O registro do próprio programa, com seu próprio tratamento de erros e registro para fins de rastreamento.

Existem algumas fontes comuns de problemas com cronjobs: * O CAMINHO ABSOLUTO do binário a ser executado. Quando você o executa no seu shell, pode funcionar, mas o processo cron parece usar outro ambiente e, portanto, nem sempre encontra binários se você não usar o caminho absoluto. * As BIBLIOTECAS usadas por um binário. É mais ou menos o mesmo ponto anterior, mas certifique-se de que, se simplesmente colocar o NAME do comando, estiver se referindo exatamente ao binário que usa a mesma biblioteca, ou melhor, verifique se o binário que você está se referindo com o caminho absoluto é o mesmo que você se refere quando usa o console diretamente. Os binários podem ser encontrados usando o comando localizar, por exemplo:

$locate python

Certifique-se de que o binário que você irá referenciar seja o mesmo que você está chamando no seu shell, ou simplesmente teste novamente no seu shell usando o caminho absoluto que você planeja colocar no cronjob.

  • Outra fonte comum de problemas é a sintaxe no cronjob. Lembre-se de que existem caracteres especiais que você pode usar para listas (vírgulas), para definir intervalos (traços -), para definir incremento de intervalos (barras), etc. Dê uma olhada: http://www.softpanorama.org/Utilities/ cron.shtml
David L
fonte
8

No Ubuntu, você pode ativar um cron.logarquivo para conter apenas as entradas CRON.

Remova o comentário da linha que menciona cronno /etc/rsyslog.d/50-default.confarquivo:

#  Default rules for rsyslog.
#

#                       For more information see rsyslog.conf(5) and /etc/rsyslog.conf

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                          /var/log/cron.log

Salve e feche o arquivo e reinicie o rsyslogserviço:

sudo systemctl restart rsyslog

Agora você pode ver as entradas do log cron em seu próprio arquivo:

sudo tail -f /var/log/cron.log

Saídas de amostra:

Jul 18 07:05:01 machine-host-name CRON[13638]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)

No entanto, você não verá mais informações sobre quais scripts foram realmente executados dentro /etc/cron.dailyou /etc/cron.hourly, a menos que esses scripts direcionem a saída para o cron.log (ou talvez para outro arquivo de log).

Se você deseja verificar se um crontab está em execução e não precisa procurá-lo cron.logou syslogcrie um crontab que redirecione a saída para um arquivo de log de sua escolha - algo como:

# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
30 2 * * 1 /usr/local/sbin/certbot-auto renew >> /var/log/le-renew.log 2>&1

Etapas realizadas em: https://www.cyberciti.biz/faq/howto-create-cron-log-file-to-log-crontab-logs-in-ubuntu-linux/

Gianfranco P.
fonte
O Ubuntu 16.04 não mostrou nenhum log do cron e essas informações fizeram o truque.
Pojda
5

cron já envia a saída padrão e o erro padrão de cada trabalho executado por correio para o proprietário do trabalho cron.

Você pode usar MAILTO=recipientnocrontab arquivo para enviar os emails para uma conta diferente.

Para que isso funcione, você precisa ter o correio funcionando corretamente. Entregar em uma caixa de correio local geralmente não é um problema (de fato, as chances sãols -l "$MAIL" que você já esteja recebendo alguns), mas para tirá-lo da caixa e colocá-lo na Internet é necessário o MTA (Postfix, Sendmail, o que você tem) para esteja configurado corretamente para conectar-se ao mundo.

Se não houver saída, nenhum email será gerado.

Uma organização comum é redirecionar a saída para um arquivo. Nesse caso, é claro que o daemon cron não verá o trabalho retornar nenhuma saída. Uma variante é redirecionar a saída padrão para um arquivo (ou gravar o script para que ele nunca imprima nada - talvez armazene resultados em um banco de dados ou execute tarefas de manutenção que simplesmente não produzem nada?) E receba um email apenas se houver é uma mensagem de erro.

Para redirecionar os dois fluxos de saída, a sintaxe é

42 17 * * * script >>stdout.log 2>>stderr.log

Observe como anexamos (duplo >>) em vez de substituir, para que a saída de qualquer trabalho anterior não seja substituída pela próxima.

Conforme sugerido em muitas respostas aqui, você pode enviar os dois fluxos de saída para um único arquivo; substitua o segundo redirecionamento por 2>&1"erro padrão deve ir para onde a saída padrão estiver indo". (Mas eu particularmente não apoio essa prática. Principalmente faz sentido se você realmente não espera nada na saída padrão, mas pode ter esquecido alguma coisa, talvez proveniente de uma ferramenta externa chamada no seu script.)

crontrabalhos são executados no diretório inicial, portanto, qualquer nome de arquivo relativo deve ser relativo a isso. Se você deseja gravar fora do diretório inicial, obviamente precisará separadamente garantir que tenha acesso de gravação ao arquivo de destino.

Um antipadrão comum é redirecionar tudo para /dev/null(e depois pedir ao Stack Overflow para ajudá-lo a descobrir o que deu errado quando algo não está funcionando; mas também não podemos ver a saída perdida!)

No script, mantenha a saída regular (resultados reais, de preferência em formato legível por máquina) e os diagnósticos (geralmente formatados para um leitor humano) separados. Em um script de shell,

echo "$results"  # regular results go to stdout
echo "$0: something went wrong" >&2

Algumas plataformas (e, por exemplo, o GNU Awk) permitem que você use o nome do arquivo /dev/stderrpara mensagens de erro, mas isso não é adequadamente portátil; em Perl warne dieimprima com erro padrão; em Python, escreva para sys.stderrou use logging; em Ruby, tente $stderr.puts. Observe também como as mensagens de erro devem incluir o nome do script que produziu a mensagem de diagnóstico.

triplo
fonte
1

Caso você esteja executando algum comando com o sudo, ele não permitirá. Sudo precisa de um tty.

Saad Masood
fonte
4
Isso também depende da sudoconfiguração. Coisas que precisam ser executadas sem uma maneira de fornecer uma senha devem ser configuradas NOPASSWD:na sua sudoersconfiguração.
Tripleee
0

Se você ainda deseja verificar seus trabalhos cron, forneça uma conta de email válida ao definir os trabalhos Cron no cPanel.

Ao especificar um email válido, você receberá a saída do trabalho cron que é executado. Assim, você poderá verificá-lo e garantir que tudo foi executado corretamente. Observe que você não receberá um email se não houver saída do comando cron job.

Lembre-se de que você receberá um email para cada um dos trabalhos cron executados. Isso pode inundar sua caixa de entrada caso seus crons sejam executados com muita frequência

Faridul Khan
fonte