web-dev-qa-db-fra.com

l'exécution de crontab n'a pas les mêmes variables d'environnement que l'utilisateur exécutant

J'ai exécuté mon travail crontab 0 2 */1 * * /aScript >aLog.log 2>&1 en tant qu'utilisateur 'root', et cependant j'ai trouvé que l'env est différent de l'env de l'utilisateur 'root', et donc éprouve un comportement d'exécution différent de mes scripts.

Un correctif tentait de placer les commandes d'exportation dans les fichiers rc.d, mais il ne s'affichait toujours pas! Je finis par placer des commandes d'exportation dans le aScript lui-même.

Ma question est qu'il existe une meilleure façon d'aborder ce problème? et pourquoi env manque même s'il provient du même utilisateur "root"? (Je modifie crontab en exécutant 'crontab -e' depuis la racine)

24
Bamboo

Cron fonctionne toujours avec un environnement principalement vide. HOME, LOGNAME et Shell sont définis; et un PATH très limité. Il est donc conseillé d'utiliser des chemins d'accès complets aux exécutables et d'exporter toutes les variables dont vous avez besoin dans votre script lorsque vous utilisez cron.

Il existe plusieurs approches que vous pouvez utiliser pour définir vos variables d'environnement dans cron, mais elles reviennent toutes à le définir dans votre script.

Approche 1:

Définissez manuellement chaque variable dont vous avez besoin dans votre script.

Approche 2:

Sourcez votre profil:

. $HOME/.bash_profile (ou . $HOME/.profile)

(Vous constaterez généralement que le fichier ci-dessus source d'autres fichiers (par exemple ~/.bashrc -> /etc/bashrc -> /etc/profile.d/*) - sinon, vous pouvez également les obtenir.)

Approche 3:

Enregistrez vos variables d'environnement dans un fichier (exécutez en tant qu'utilisateur souhaité):

env > /path/to/my_env.sh

Importez ensuite via votre script cron:

env - `cat /path/to/my_env.sh` /bin/sh

Approche 4:

Dans certains cas, vous pouvez définir des variables globales cron dans /etc/default/cron. Il existe cependant un élément de risque, car ils seront définis pour tous les travaux cron.

35
cyberx86

Dans RedHat CentOS, vous pouvez définir /etc/rc.d/init.d/functions par défaut PATH pour définir définitivement. /etc/rc.d/crond appelle des fonctions au démarrage.

1
user215450

Cron crée son OWN Shell avec l'utilisation spécifiée à travers laquelle il s'exécutera.

Donc, si vous souhaitez conserver la même variable de votre utilisateur, essayez de l'exécuter avec votre propre utilisateur, au lieu de root ou de tout autre utilisateur.

Ou

La meilleure façon est d'exporter ces variables dans votre propre script.

1
Farhan

J'ai eu un problème similaire sur mon AWS. Compris comme ça

which python3

m'a donné /usr/bin/local/python3 emplacement

et alors

. $HOME/.profile; /usr/local/bin/python3 /home/ubuntu/your_script.py
0
Al Po