Ambiente diferente
Cron passa um conjunto mínimo de variáveis de ambiente para seus trabalhos. Para ver a diferença, adicione um trabalho falso assim:
* * * * * env > /tmp/env.output
Espere que /tmp/env.output
seja criado e remova o trabalho novamente. Agora compare o conteúdo de /tmp/env.output
com a saída de env
em seu terminal normal.
Uma "pegadinha" comum é a variável de ambiente PATH
sendo diferente. Talvez seu script do cron use o comando somecommand
encontrado em /opt/someApp/bin
, que você adicionou a PATH
in /etc/environment
? O cron ignora PATH
desse arquivo, então runnning somecommand
do seu script falhará quando executado com o cron, mas funciona quando executado em um terminal. Vale a pena notar que as variáveis de /etc/environment
serão passadas para tarefas agendadas, mas não as variáveis que o cron define especificamente, como PATH
.
Para contornar isso, basta definir sua própria variável PATH
na parte superior do script. Por exemplo,
#!/bin/bash
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# rest of script follows
Alguns preferem apenas usar caminhos absolutos para todos os comandos. Eu recomendo contra isso. Considere o que acontece se você deseja executar seu script em um sistema diferente e, nesse sistema, o comando está em /opt/someAppv2.2/bin
. Você teria que percorrer todo o script substituindo /opt/someApp/bin
por /opt/someAppv2.2/bin
em vez de apenas fazer uma pequena edição na primeira linha do script.
Você também pode definir a variável PATH no arquivo crontab, que será aplicada a todas as tarefas do cron. Por exemplo,
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
15 1 * * * backupscript --incremental /home /root