Como redirecionar a saída para um arquivo de dentro do cron?

87

Eu tenho um script de backup que preciso executar em uma determinada hora do dia, por isso estou usando cron para essa tarefa e de dentro do cron estou também tentando redirecionar a saída do script de backup para logfile .

crontab -e

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

Na entrada do cron acima, estou redirecionando os dois stderr and stdout para um arquivo de log.

A tarefa cron acima é executada de acordo com syslog e realiza a tarefa mencionada no arquivo backup.sh , 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 a partir 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:~$ 

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

    
por RanRag 19.10.2012 / 17:16

2 respostas

131

Eu resolvi o problema. Existem duas maneiras:

M1

Altere o redirecionamento de &>> para 2>&1 . Então agora crontab -e parece com

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

Acredito que os trabalhos acima porque, por padrão, cron está usando sh para executar a tarefa, em vez de bash , então &>> não é suportado por sh .

M2

Altere o shell padrão adicionando SHELL=/bin/bash no arquivo crontab -e .

    
por 19.10.2012 / 17:39
5

aviso de isenção [1].

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

Certifique-se de que a sintaxe de redirecionamento do shell esteja de acordo com /bin/sh . Se você tentar usar a sintaxe de redirecionamento de shell que não é válida com /bin/sh , seu comando falhará e seu trabalho cron nunca será executado.

Nos arquivos /etc/cron.d/example1 config, se você especificar um usuário diferente de root e o shell de login desse usuário não for /bin/bash ..., você ainda deverá usar a sintaxe / bin / sh no comando /etc/cron.d/example1 .

Por exemplo

Se o seu usuário tiver o shell csh ou zsh ou ksh definido para seu shell de login. No seu arquivo /etc/cron.d/example1 config, o comando deve usar a sintaxe /bin/sh . Especificamente, qualquer redirecionamento de shell deve ter /bin/sh de sintaxe.

Se você tentar usar por exemplo a sintaxe de redirecionamento csh shell no seu /etc/cron.d/example1 , seu trabalho cron nunca será executado. O arquivo de log para crond localizado em /var/log/cron dirá que o comando foi executado, mas o comando irá cometer um erro de sintaxe antes que seu comando seja executado.

Onde crond emite mensagens de erro para um erro de sintaxe?

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

[1]

Aviso de isenção

  • Esta resposta pressupõe um sysv system
  • systemd informações podem diferir
  • Especificamente, essas informações foram aprendidas para centos-6 distro e podem não se aplicar a diferentes sysv distros
    • menciono centos-6 especificamente, porque diferentes distros podem ter uma implementação crond diferente que difere de centos-6
por 29.05.2017 / 22:06