Cronjob sobrescreve o redirecionamento de Saída de Script

0

Estou com um pequeno problema com um cronjob que executa um script meu.

O script é parecido com isto, chama-se create_report.sh :

#!/bin/bash
cd /work/directory
/some/command.sh > reports/report_$(date -d "1 day ago" +%Y%m%d).txt

Isso é obviamente um pouco simplificado, mas depois de gravar a saída em algum arquivo esse arquivo é anexado a um e-mail e enviado para mim.

Quando executo esse "manualmente", ele funciona bem e o arquivo de relatório tem conteúdo.

Em seguida, criei um cronjob usando crontab-generator.org, que executa esse script todas as manhãs às 7h e silencia a saída do script.

0 7 * * * /path/to/script/create_report.sh >/dev/null 2>&1

Quando o cronjob executa o script, os arquivos de relatório são criados e enviados para mim, mas estão vazios. Eu provavelmente poderia descobrir uma maneira de contornar esse comportamento, mas eu não esperava que isso acontecesse, alguém pode me explicar como isso aconteceu e talvez apontar a maneira correta de fazer algo assim acontecer?

Para esclarecer: não estou interessado na saída de create_report.sh , mas no arquivo de relatório criado.

Obrigado antecipadamente!

    
por Maurice 29.03.2017 / 08:39

2 respostas

1

Quando o cron executa seu cron job, ele (eventualmente) executará o bash para executar seu script, mas essa instância do bash será não-interativa e não um shell de login, portanto, ele não fornecerá nenhum dos seus arquivos de perfil. 1 Se o seu /some/command.sh confia em qualquer um desses perfis (para definir uma variável ou realizar uma atividade), então você precisa:

  • forneça explicitamente esses arquivos ou
  • defina BASH_ENV (para o arquivo correto) antes de executar o script ou
  • defina a opção -i na linha she-bang (para carregar ~/.bashrc ) ou
  • defina as opções -i e --login na linha she-bang (para carregar a primeira de ~/.bash_profile , ~/.bash_login ou ~/.profile ) ou
  • defina essas variáveis ou execute essas atividades em /some/command.sh

Referência:

Nota de rodapé:

  1. a menos que você já tenha definido BASH_ENV
por 29.03.2017 / 15:37
1

vejo dois problemas:

1. %código% Forneça um caminho absoluto para o diretório /some/command.sh > reports/report_$(...).txt , como: reports

Como funciona na execução manual, presumo que o script seja executado em um CWD diferente quando executado pelo daemon do cron.

2. Você executa este cronjob sob o mesmo usuário?

Se não, verifique se o usuário real, que está executando este cronjob, tem todas as permissões necessárias (como gravar no /some/command.sh > /home/user/reports/report_$(...).txt dir).

Se nada funcionar, você pode depurar ainda mais observando o syslog (por exemplo, reports ) e gravar qualquer saída (stdout AND stderr) no disco: tail -f /var/log/syslog | grep CRON

    
por 29.03.2017 / 14:23