Existem três causas comuns para os comandos do cron job se comportarem de maneira diferente em comparação aos comandos digitados diretamente em um shell interativo, em ordem aproximada de semelhança:
- O Cron fornece um ambiente limitado, por exemplo, um número mínimo
$PATH
e outras variáveis esperadas ausentes.
- Cron chama
/bin/sh
por padrão, enquanto você pode estar usando algum outro shell interativamente.
- Cron trata o
%
personagem especialmente (ele é transformado em uma nova linha no comando).
- O Cron não fornece um ambiente terminal ou gráfico.
Você deve preceder todos os %
caracteres com a \
em um arquivo crontab, o que instrui o cron a colocar apenas uma porcentagem no comando. Lembre-se de que quando você usa o date
comando em um trabalho 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 corrigi alguns problemas de cotação:
- Isso não estava causando problemas além da legibilidade, mas você não deve usar backticks para substituição de comandos. Em
$(…)
vez disso, use : suas regras de análise são mais simples.
- Sempre use aspas duplas em torno das substituições de variáveis e comandos:
"$somevariable"
, "$(somecommand)"
. Aqui, a falta de aspas é inofensiva porque o date
comando nunca retornou nenhum caractere especial para os formatos usados, mas você deve se lembrar cuidadosamente de quais caracteres são especiais e verificar isso toda vez que deixar uma substituição sem aspas. Mantenha a simplicidade, sempre use aspas duplas, a menos que você queira que a divisão de campos e a geração de nome de arquivo ocorram no resultado.
- Você tinha aspas simples, impedindo a expansão em torno de algumas substituições de comando. Use aspas duplas.
/bin/sh: 1: Syntax error: EOF in backquote substitution
Para o primeiro trabalho cron./bin/sh: 1: Syntax error: Unterminated quoted string
Para o segundo trabalho cron.