Molto probabilmente, cron è in esecuzione in un ambiente molto scarso. Controlla le variabili d'ambiente che cron sta usando aggiungendo un lavoro fittizio che scarica env
in un file come questo:
* * * * * env > env_dump.txt
Confrontalo con l'output di env
in una normale sessione di shell.
Puoi anteporre le tue variabili di ambiente al crontab locale definendole nella parte superiore del tuo crontab.
Ecco una soluzione rapida per anteporre $PATH
al crontab corrente:
# echo PATH=$PATH > tmp.cron
# echo >> tmp.cron
# crontab -l >> tmp.cron
# crontab tmp.cron
Il crontab risultante sarà simile alla risposta di chrissygormley, con PATH definito prima delle regole del crontab.
Dovresti inserire percorsi completi nel tuo crontab
. Questa è l'opzione più sicura.
Se non vuoi farlo, puoi inserire uno script wrapper attorno ai tuoi programmi e impostare il PERCORSO lì dentro.
ad esempio
01 01 * * * command
diventa:
01 01 * * * /full/path/to/command
Anche qualsiasi cosa chiamata da cron
dovrebbe stare molto attento ai programmi che esegue, e probabilmente impostare la propria scelta per il PATH
variabile.
MODIFICA:
Se non sai dove si trova il comando che vuoi eseguire which <command>
dal tuo guscio e ti dirà il percorso.
EDIT2:
Quindi, una volta che il programma è in esecuzione, la prima cosa da fare è impostare PATH
e qualsiasi altra variabile richiesta (ad es. LD_LIBRARY_PATH
) ai valori richiesti per l'esecuzione dello script.
Fondamentalmente, invece di pensare a come modificare l'ambiente cron per renderlo più adatto al tuo programma/script, fai in modo che il tuo script gestisca l'ambiente che gli viene fornito, impostandone uno appropriato all'avvio.
Ho usato /etc/crontab
. Ho usato vi
e ho inserito i PERCORSI di cui avevo bisogno in questo file e l'ho eseguito come root. Il normale crontab sovrascrive i PERCORSI che hai impostato. Un buon tutorial su come farlo.
Il file cron a livello di sistema ha questo aspetto:
This has the username field, as used by /etc/crontab.
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file.
# This file also has a username field, that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
42 6 * * * root run-parts --report /etc/cron.daily
47 6 * * 7 root run-parts --report /etc/cron.weekly
52 6 1 * * root run-parts --report /etc/cron.monthly
01 01 * * 1-5 root python /path/to/file.py