Si vous utilisez crontab pour vos tâche, faites attention à un détail : le PATH.
il y a un fichier de conf que j’ai pas réussi à faire fonctionner dans /etc/crontab, si vous y arrivez tant mieux sinon éditez votre cron de la sorte:
1. Version avec PATH défini par tâche:
30 23 * * * PATH=$PATH:/usr/local/bin && export PATH && python /home/penetrator/script.py |
2. Version avec variables définies en haut du fichier cron:
# Env SHELL=/bin/bash HOME=/home/prod PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin # Cmd cron 30 23 * * * python /home/penetrator/script.py |
$PATH=PATH:/usr/local/bin && export PATH va rajouter /usr/local/bin dans le PATH.
Ayant installé et compilé un programme dans /usr/local/bin et l’utilisant dans script.py, il faut que son chemin soit dans le PATH.
Pour avoir des infos sur l’env de votre cron:
* * * * * PATH=$PATH:/usr/local/bin && export PATH && env > /tmp/cronenv |
faites un tail -f /tmp/cronenv pour voir si votre PATH est bien déclaré.
ça peut éviter quelques heures à s’arracher les cheveux pour le debug d’un script…
le plus simple est de définir les variables en haut du fichier cron comme expliqué dans
man 5 crontab
sur mes serveurs j’ai au moins ça:
# Env
SHELL=/bin/bash
HOME=/home/prod
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
# Cmd cron
...
PATH=$PATH:/usr/local/bin
, pas$PATH=PATH
!Et sinon je crois qu’on peut définir une variable juste pour une commande:
PATH=$PATH:/usr/local/bin python /home/penetrator/script.py
@gkar, ouais ça aussi c’est bien je le rajoute, thanks
@shnouki , merci je corrige
Bonsoir,
Question de
Je rencontre des difficultés avec la planification de mon script qui doit être lancé dans un environnement virtuel avec des chemins relatifs dedans (vers la BD et surtout les autres modules) :
– lorsque j’indique “en dur” tous les chemins contenus dans le script en absolus, que je lance manuellement ou via le cron : OK
– lorsque les chemins sont indiqués en relatif et que je lance manuellement : OK
– lorsque les chemins sont indiqués en relatif et c’est lancé via le cron : ça plante !
Nous avons commencé notre développement en chemins absolus et ça roulait donc bien avec ceci dans crontab -e :
0 1,13 * * * /home/$USER/chemin_vers_virtualenv /home/$USER/chemin_vers_script.py
Depuis qu’on a passé les chemins en relatif (pour des besoins de portabilité et puis pour faire plus propre), ça merdouille au moment des imports relatifs (‘from . import models’). Du coup, j’essaye d’appliquer la logique indiquée et je me dis que je dois mettre ça :
0 1,13 * * * PATH=$PATH:/home/$USER/chemin_vers_virtualenv /home/$USER/chemin_vers_script.py
Mais je me dis que je passe à côté de quelque chose et je comprends pas pourquoi le cron fait merder quand c’est en chemin relatif.
Sur le principe, si j’ai bien compris : on lui file les horaires et la fréquence, le chemin vers l’environnement d’exécution (ici un virtualenv) et le script à lancer ?
Il faut éviter les imports (et non les chemins, ce n’est pas du tout pareil), comme la peste en Python. Tout mettre en absolu. Ca ne gène pas la portabilité si le code est bien organisés en modules avec responsabilités séparées.