Très probablement, cron s'exécute dans un environnement très clairsemé. Vérifiez les variables d'environnement que cron utilise en ajoutant une tâche factice qui vide env
dans un fichier comme celui-ci :
* * * * * env > env_dump.txt
Comparez cela avec la sortie de env
dans une session shell normale.
Vous pouvez ajouter vos propres variables d'environnement à la crontab locale en les définissant en haut de votre crontab.
Voici une solution rapide pour ajouter $PATH
à la crontab actuelle :
# echo PATH=$PATH > tmp.cron
# echo >> tmp.cron
# crontab -l >> tmp.cron
# crontab tmp.cron
Le crontab résultant ressemblera à la réponse de chrissygormley, avec PATH défini avant les règles du crontab.
Vous devriez mettre des chemins complets dans votre crontab
. C'est l'option la plus sûre.
Si vous ne voulez pas faire cela, vous pouvez mettre un script wrapper autour de vos programmes et y définir le PATH.
ex.
01 01 * * * command
devient :
01 01 * * * /full/path/to/command
Aussi tout ce qui est appelé depuis cron
devrait faire très attention aux programmes qu'il exécute et définir probablement son propre choix pour le PATH
variables.
MODIFIER :
Si vous ne savez pas où se trouve la commande que vous voulez exécuter which <command>
de votre shell et il vous indiquera le chemin.
EDIT2 :
Ainsi, une fois que votre programme est en cours d'exécution, la première chose qu'il doit faire est de définir PATH
et toute autre variable requise (par exemple LD_LIBRARY_PATH
) aux valeurs requises pour l'exécution du script.
Fondamentalement, au lieu de penser à modifier l'environnement cron pour le rendre plus adapté à votre programme/script, faites en sorte que votre script gère l'environnement qui lui est donné, en définissant un environnement approprié au démarrage.
J'ai utilisé /etc/crontab
. J'ai utilisé vi
et entré dans les chemins dont j'avais besoin dans ce fichier et l'a exécuté en tant que root. La crontab normale écrase les PATH que vous avez configurés. Un bon tutoriel sur la façon de procéder.
Le fichier cron à l'échelle du système ressemble à ceci :
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