Como redirecionar a saída para um arquivo no cron?

105

Eu tenho um script de backup que preciso executar em um horário específico do dia, portanto, estou usando cronessa tarefa e, a partir do cron, também estou tentando redirecionar a saída do script de backup para a logfile.

crontab -e

*/1 * * * * /home/ranveer/backup.sh &>> /home/ranveer/backup.log

Na entrada cron acima, estou redirecionando ambos stderr and stdoutpara um arquivo de log.

O trabalho cron acima executa bem de acordo com syslog e executa a tarefa mencionada no backup.sharquivo, mas não grava nada no arquivo de log.

/var/log/syslog

Oct 19 20:26:01 ranveer CRON[15214]: (ranveer) CMD (/home/ranveer/backup.sh &>> /home/ranveer/backup.log)

Quando executo o script do cli, ele funciona conforme necessário e a saída é gravada em um arquivo de log

ranveer@ranveer:~$ ./backup.sh &>> backup.log 
ranveer@ranveer:~$ cat backup.log
Fri Oct 19 20:28:01 IST 2012
successfully copied testdir
test.txt successfully copied
-------------------------------------------------------------------------------------
ranveer@ranveer:~$ 

Portanto, por que a saída do arquivo não está sendo redirecionada para o arquivo no cron.

RanRag
fonte
superuser.com/questions/122246/…
Ciro Santilli escreveu:

Respostas:

158

Eu resolvi o problema. Existem duas maneiras:

M1

Mude o redirecionamento de &>>para 2>&1. Então agora crontab -eparece

*/1 * * * * /home/ranveer/vimbackup.sh >> /home/ranveer/vimbackup.log 2>&1

Eu acredito que as obras acima porque, por padrão cronestá usando shpara executar a tarefa, em vez de bashpor isso &>>não é suportado pelo sh.

M2

Mude o shell padrão adicionando SHELL=/bin/bashno crontab -earquivo.

RanRag
fonte
14
croné como sh: não escolhe um único programa. Existem muitas implementações. A implementação mais prevalente é o Vixie cron. Eu sou o autor (atual, não o original) de outro. Acredito que a maioria dos daemons Cron usará o sistema sh, mas isso pode variar se ele aceita &>>. Alguns daemons cron (como o meu) não permitem alterar qual shell executa as linhas cron com SHELL=...linhas no crontab. Estou feliz que você encontrou uma solução que funciona para você; só pensei que valeria a pena ressaltar que há muitas variáveis ​​que podem afetar se funciona para outras pessoas.
precisa
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
1
@ Danijel: Isso deve ajudar serverfault.com/questions/117360/…
RanRag 15/01/16
2
*/1 * * * * /home/ranveer/vimbackup.sh &>> /home/ranveer/vimbackup.logfaz a mesma coisa também.
Yanick Girouard
5

aviso legal [1].

Gostaria de adicionar uma nota de rodapé ou adendo à resposta de @ RanRag .

Verifique se a sintaxe de redirecionamento do shell está em conformidade /bin/sh. Se você tentar usar a sintaxe de redirecionamento de shell inválida /bin/sh, seu comando falhará e seu trabalho cron nunca será executado.

Nos seus /etc/cron.d/example1arquivos de configuração, se você especificar um usuário que não seja roote o shell de login desse usuário não é /bin/bash... você ainda deve usar a sintaxe / bin / sh no /etc/cron.d/example1comando.


Por exemplo

Se o usuário tiver um shell cshou zshou kshdefinido para o seu shell de login. No seu /etc/cron.d/example1arquivo de configuração, o comando deve usar /bin/shsintaxe. Especificamente, qualquer redirecionamento de shell deve ser /bin/shsintaxe.

Se você tentar usar, por exemplo, cshsintaxe de redirecionamento de shell no seu /etc/cron.d/example1, seu trabalho cron nunca será executado. O arquivo de log para crondlocalizado em /var/log/crondirá que o comando foi executado, mas o comando apresentará um erro de sintaxe antes que o comando seja executado.

Onde crondemite mensagens de erro para um erro de sintaxe?

O erro nunca é relatado em /var/log/cron. crondem vez disso, por padrão, emite qualquer mensagem de erro usando mail. Portanto, você deve verificar /var/spool/mail/${USER}para ver qual é o erro.

[1]

aviso Legal

  • Esta resposta assume um sysvsistema
  • systemd informação pode diferir
  • Especificamente, essas informações foram aprendidas para centos-6distribuição e podem não se aplicar a sysvdistribuições diferentes
    • Menciono centos-6especificamente, porque diferentes distros podem ter uma crondimplementação diferente que difere decentos-6
Trevor Boyd Smith
fonte
2
se você deseja que seu /etc/cron.d/example1comando use um shell diferente, você pode usar set the SHELL=no seu /etc/cron.d/example1arquivo de configuração.
Trevor Boyd Smith