Variable d’environnement PATH et crontab


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…

7 thoughts on “Variable d’environnement PATH et crontab

  • Gkar

    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
    ...

  • Schnouki

    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

  • Max Post author

    @gkar, ouais ça aussi c’est bien je le rajoute, thanks

    @shnouki , merci je corrige

  • Guts

    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 ?

  • Sam

    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.

  • Thomas Decaux

    Comment peut on simuler cet “environement” CRON pour tester ?

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.