Eu tenho um script de backup que preciso executar em um horário específico do dia, portanto, estou usando cron
essa 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 stdout
para um arquivo de log.
O trabalho cron acima executa bem de acordo com syslog
e executa a tarefa mencionada no backup.sh
arquivo, 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.
bash
io-redirection
cron
RanRag
fonte
fonte
Respostas:
Eu resolvi o problema. Existem duas maneiras:
M1
Mude o redirecionamento de
&>>
para2>&1
. Então agoracrontab -e
pareceEu acredito que as obras acima porque, por padrão
cron
está usandosh
para executar a tarefa, em vez debash
por isso&>>
não é suportado pelosh
.M2
Mude o shell padrão adicionando
SHELL=/bin/bash
nocrontab -e
arquivo.fonte
cron
é comosh
: 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 sistemash
, mas isso pode variar se ele aceita&>>
. Alguns daemons cron (como o meu) não permitem alterar qual shell executa as linhas cron comSHELL=...
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.YYYY-MM-DD_hh-mm-sec
no nome do arquivo de saída, para que cada nome de arquivo seja diferente e mantido sem reescrever?*/1 * * * * /home/ranveer/vimbackup.sh &>> /home/ranveer/vimbackup.log
faz a mesma coisa também.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/example1
arquivos de configuração, se você especificar um usuário que não sejaroot
e o shell de login desse usuário não é/bin/bash
... você ainda deve usar a sintaxe / bin / sh no/etc/cron.d/example1
comando.Por exemplo
Se o usuário tiver um shell
csh
ouzsh
ouksh
definido para o seu shell de login. No seu/etc/cron.d/example1
arquivo de configuração, o comando deve usar/bin/sh
sintaxe. Especificamente, qualquer redirecionamento de shell deve ser/bin/sh
sintaxe.Se você tentar usar, por exemplo,
csh
sintaxe de redirecionamento de shell no seu/etc/cron.d/example1
, seu trabalho cron nunca será executado. O arquivo de log paracrond
localizado em/var/log/cron
dirá que o comando foi executado, mas o comando apresentará um erro de sintaxe antes que o comando seja executado.Onde
crond
emite mensagens de erro para um erro de sintaxe?O erro nunca é relatado em
/var/log/cron
.crond
em vez disso, por padrão, emite qualquer mensagem de erro usandomail
. Portanto, você deve verificar/var/spool/mail/${USER}
para ver qual é o erro.[1]
aviso Legal
sysv
sistemasystemd
informação pode diferircentos-6
distribuição e podem não se aplicar asysv
distribuições diferentescentos-6
especificamente, porque diferentes distros podem ter umacrond
implementação diferente que difere decentos-6
fonte
/etc/cron.d/example1
comando use um shell diferente, você pode usar set theSHELL=
no seu/etc/cron.d/example1
arquivo de configuração.