J'ai exécuté mon travail crontab en 0 2 */1 * * /aScript >aLog.log 2>&1
tant qu'utilisateur 'root', et cependant j'ai trouvé que l'env est différent de l'env de l'utilisateur 'root', et que j'ai donc 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'est toujours pas affiché! Je finis par placer des commandes d'exportation dans 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)
linux
cron
environment-variables
Bambou
la source
la source
source
votre profil (bash).Réponses:
Cron fonctionne toujours avec un environnement principalement vide. HOME, LOGNAME et SHELL sont définis; et un CHEMIN 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 lors de l'utilisation de cron.
Il existe plusieurs approches que vous pouvez utiliser pour définir vos variables d'environnement dans cron, mais elles reviennent toutes à les 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 source.)
Approche 3:
Enregistrez vos variables d'environnement dans un fichier (exécutez en tant qu'utilisateur souhaité):
Importez ensuite via votre script cron:
Approche 4:
Dans certains cas, vous pouvez définir des variables cron globales dans
/etc/default/cron
. Il y a cependant un élément de risque, car ceux-ci seront définis pour toutes les tâches cron.la source
bash: SHELL=/bin/bash: No such file
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.
la source
Dans RedHat CentOS, vous pouvez définir /etc/rc.d/init.d/functions par défaut PATH pour définir de manière permanente. /etc/rc.d/crond appelle des fonctions au démarrage.
la source
J'ai eu un problème similaire sur mon AWS. Compris comme ça
m'a donné l'
/usr/bin/local/python3
emplacementpuis
la source