O programa cron
é executado em um ambiente muito limitado - você pode ver, por exemplo, se você cria um crontab contendo
* * * * * /usr/bin/printenv > /tmp/cronenv
e, em seguida, observe o arquivo resultante:
$ cat /tmp/cronenv
LANGUAGE=en_CA:en
HOME=/home/steeldriver
LOGNAME=steeldriver
PATH=/usr/bin:/bin
LANG=en_CA.UTF-8
SHELL=/bin/sh
PWD=/home/steeldriver
O mesmo se aplica a root
crontabs (ou seja, trabalhos enviados usando sudo crontab -e
):
LANGUAGE=en_CA:en
HOME=/root
LOGNAME=root
PATH=/usr/bin:/bin
LANG=en_CA.UTF-8
SHELL=/bin/sh
PWD=/root
Em particular, o padrão PATH
contém apenas /bin
e /usr/bin
; isso seria bom para mount
:
$ which mount
/bin/mount
no entanto, isso não funcionará para mount.cifs
, por exemplo, pois está em /usr/sbin
:
$ which mount.cifs
/sbin/mount.cifs
A solução é:
-
sempre use o caminho absoluto completo para programas executáveis em scripts a serem executados como tarefas agendadas; por exemplo,
/usr/sbin/mount.cifs //192.168.1.200/share /media/SVR1 -o user=username,pass=pwd | tee -a ${LOGFILE}
ou
-
adicione uma designação
PATH
adequada na parte superior desses scripts, por exemplo,PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NOTA: As tarefas executadas a partir do diretório /etc/cron.d
do sistema têm um caminho mais extenso definido explicitamente em /etc/crontab
:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin