comment définir la variable PATH crontab

17

J'ai rencontré un problème lors de l'exécution d'un script à partir de crontab. Après quelques recherches, j'ai compris que le problème était dû au fait que le paramètre PATH n'inclut pas / sbin.

J'ai regardé ce qu'il inclut dans / etc / crontab:

PATH=/sbin:/bin:/usr/sbin:/usr/bin

Comme test - tâche cron simple pour imprimer la variable PATH:

* * * * * echo $PATH &> /root/TMP.log

la sortie est:

cat /root/TMP.log
/usr/bin:/bin

Je ne comprends pas ce comportement ... Comment définir la variable PATH ..? Ou mieux - comment y ajouter des chemins?

csny
la source

Réponses:

17

Bien qu'ils soient similaires, un utilisateur crontab (modifié à l'aide de crontab -e) est différent de et conserve un chemin distinct de la crontab système (modifié en éditant / etc / crontab).

Le système crontab a 7 champs, insérant un nom d'utilisateur avant la commande. L'utilisateur crontab, en revanche, n'a que 6 champs, allant directement dans la commande immédiatement après les champs de temps.

De même, le CHEMIN dans la crontab système inclut normalement les répertoires / sbin, contrairement au CHEMIN dans la crontab utilisateur. Si vous souhaitez définir PATH pour l'utilisateur crontab, vous devez définir la variable PATH dans l'utilisateur crontab.


Une solution de contournement simple pour ajouter votre PATH normal dans les commandes shell dans cron est d'avoir le cronjob source votre profil en exécutant bash dans un shell de connexion. par exemple au lieu de

* * * * * some command

Vous pouvez plutôt exécuter

* * * * * bash -lc some command

De cette façon, si votre profil définit le PATH ou d'autres variables d'environnement sur quelque chose de spécial, il est également inclus dans votre commande.

madumlao
la source
Merci, cela explique cela ... Mais de cette façon, je ne peux que définir le PATH, et non pas le modifier, car PATH = / sbin: $ PATH ou similaire ne fonctionne pas. J'ai essayé ...
csny
Oui, vous devrez définir le PATH à partir de zéro dans un cas comme celui-ci, ce qui devrait être assez facile, car vous connaissez toutes les commandes qui sont exécutées dans votre crontab, il vous suffit donc de les prendre en considération.
haricots
@madumlao bash -lcn'aide pas. Je suis bon pour l'instant avec la configuration manuelle de PATH, mais si j'installe certains scripts, je veux qu'ils soient reconnus dans les cronjobs sans spécifier de chemins complets. Je suis sûr que c'est possible d'une manière ou d'une autre et bash -lcest sur le point de trouver une solution :)
csny
4
bash -lc démarre un shell de connexion qui source le profil de votre utilisateur. Cela signifie qu'il utilise le PATH défini dans ~ / .bash_profile, ~ / .profile ou ~ / .bashrc ... avez-vous le chemin défini ici? Si c'est le cas et que cela fonctionne mal, mettez à jour ma réponse
madumlao
Génial. Merci Madunlao. Après avoir ajouté manuellement le dossier de fichiers bin à ~ / .bash_profile, mon cronjob fonctionne bien.
张健健
8

Si vous avez besoin de PATH par défaut à l'échelle du système et d'autres variables ENV (qui sont définies dans /etc/profile.d), mettez simplement ce qui suit:

* * * * * . /etc/profile; your cmd
Vladislav Savchuk
la source
3

Il est possible de définir le CHEMIN (ou d'autres paramètres) dans la ligne cronjob ou sur une seule ligne. Mais vous ne pouvez pas utiliser l'extension shell comme PATH=$PATH:/usr/local/bin. Mais le tilde est autorisé pour les raccourcis du répertoire personnel.

D'après les livres:

Une ligne active dans une crontab est soit un paramètre d'environnement, soit une commande cron. Un paramètre d'environnement est de la forme: nom = valeur où les espaces blancs autour du signe égal (=) sont facultatifs, et tout espace blanc non précédant dans valeur fait partie de la valeur affectée à nom. La chaîne de valeur peut être placée entre guillemets (simple ou double, mais correspondant) pour conserver les espaces blancs de début ou de fin.

Voir man 5 crontabpour plus d'informations.

Cela devrait donc fonctionner:

PATH=/bin:/usr/bin:/my/path/bin
5 3 * * * command_that_requires_my_path
itsafire
la source
0

J'ai eu le même problème et j'ai trouvé un autre moyen d'exécuter mon script dans crontab. Je pense que la façon la plus simple d'exécuter votre programme est de créer un script qui pourrait se placer dans le répertoire de votre programme. Appelez ensuite votre programme dans ce script.

voici un exemple de script (nom du script = launcher.sh):

#!bin/bash
cd /home/pi/test
sudo python3 example.py

ensuite, rendez votre script exécutable:

chmod 755 launcher.sh

Et enfin, ajoutez votre script à crontab

crontab -e

et ajoutez cette ligne à la fin:

@reboot sh /home/pi/test/launcher.sh

(J'ai configuré le programme pour qu'il s'exécute à chaque redémarrage)

Reyhaneh Trb
la source