Existem três causas comuns para os comandos do cron job se comportarem de maneira diferente em comparação com os comandos digitados diretamente em um shell interativo, em uma ordem aproximada de commonness:
- O Cron fornece um ambiente limitado, por exemplo, um
$PATH
mínimo e outras variáveis esperadas ausentes.
- O Cron invoca
/bin/sh
por padrão, enquanto você pode estar usando algum outro shell interativamente.
- Cron trata o caractere
%
especialmente (ele é transformado em uma nova linha no comando).
- O Cron não fornece um terminal ou ambiente gráfico.
Você deve preceder todos os caracteres %
com um \
em um arquivo crontab, que informa ao cron para colocar apenas um percentual no comando. Lembre-se de que quando você usa o comando date
em uma tarefa cron.
55 8 * * 3 /usr/bin/php /home/mark/dev/processes/customClient/events.php > "/home/mark/dev/processes/customClient/events-$(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d).csv"
0 9 * * 3 /usr/bin/echo 'The csv for last week, trying my hand at automatiging this' | /usr/bin/mutt <emailaddress> -s "Events from $(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d)" -a "/home/mark/dev/processes/customClient/events-$(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d).csv"
Também consertei alguns problemas de cotação:
- Isso não estava causando outros problemas além da legibilidade, mas você não deve usar backticks para a substituição de comandos. Use
$(…)
: suas regras de análise são mais simples.
- Sempre use aspas duplas em torno das substituições de comando e variável:
"$somevariable"
, "$(somecommand)"
. Aqui a falta de aspas era inofensiva porque o comando date
nunca retornou nenhum caractere especial para os formatos que você usou, mas é preciso lembrar cuidadosamente quais caracteres são especiais e verificar isso toda vez que você deixar uma substituição sem aspas. Mantenha-o simples, use sempre aspas duplas, a menos que você queira que a divisão de campos e geração de nome de arquivo ocorra no resultado.
- Você tinha algumas aspas simples impedindo a expansão em torno de algumas substituições de comandos. Use aspas duplas.