J'essaie de faire en sorte que cron appelle les bons PATH. Lorsque j'exécute un script Python à partir du shell, le script fonctionne correctement car il utilise les PATH définis dans bashrc, mais lorsque j'utilise cron, tous les PATH ne sont pas utilisés à partir de bashrc. Y a-t-il un fichier dans lequel je peux entrer les PATH pour cron comme bashrc ou un moyen d'appeler les PATH à partir de bashrc?
Désolé, je ne pense pas avoir formulé cela correctement, je peux exécuter le script correct (ce qui signifie que le PATH vers le script dans crontab n'est pas le problème ici), c'est juste lorsque ce script est en cours d'exécution, je lance une construction et cela utilise le PATHs définis .bashrc
. Lorsque .bashrc
j'exécute le script lorsque je suis connecté, les PATH sont insérés. Puisque cron ne s'exécute pas dans un shell en soi, il n'intervient pas .bashrc
. Existe-t-il un moyen d'extraire cela sans avoir à écrire un wrapper de script bash?
source /etc/profile
, il devrait manger.bashrc
et beaucoup d'autres choses potentiellement manquantes pour vous. Le sourcing de profil explicite devient très utile si vous voulez que certains scripts s'exécutent de manière "autonome", il protège également des environnements étranges et ainsi ...sh
scripts appelés par crontab. Vous pouvez confirmer qu'il met à jour le chemin en ajoutant un travail comme* * * * * echo $PATH > ~/crontab_path.txt
et en vérifiant le fichier après une minute.Réponses:
J'ai utilisé
/etc/crontab
. J'ai utilisévi
et entré dans les CHEMINS dont j'avais besoin dans ce fichier et l'ai exécuté en tant que root. Le crontab normal écrase les PATH que vous avez configurés. Un bon tutoriel sur la façon de procéder .Le fichier cron du système ressemble à ceci:
la source
/etc/crontab
soient pas disponibles pour cron lors de l'exécution en tant que root dans Ubuntu 14.04. (sudo crontab -e
)Très probablement, cron fonctionne dans un environnement très restreint. Vérifiez les variables d'environnement que cron utilise en ajoutant un travail factice qui se vide
env
dans un fichier comme celui-ci:Comparez cela avec la sortie d'
env
une session shell normale.Vous pouvez ajouter vos propres variables d'environnement au crontab local en les définissant en haut de votre crontab.
Voici une solution rapide à ajouter
$PATH
à la crontab actuelle:Le crontab résultant ressemblera à la réponse de chrissygormley, avec PATH défini avant les règles de crontab.
la source
Vous devez mettre des chemins complets dans votre fichier
crontab
. C'est l'option la plus sûre.Si vous ne voulez pas faire cela, vous pouvez mettre un script wrapper autour de vos programmes et y définir le PATH.
par exemple
devient:
De plus, tout ce qui est appelé à partir de
cron
doit être très prudent sur les programmes qu'il exécute et probablement définir son propre choix pour laPATH
variable.ÉDITER:
Si vous ne savez pas où se trouve la commande que vous souhaitez exécuter à
which <command>
partir de votre shell, elle vous indiquera le chemin.EDIT2:
Ainsi, une fois que votre programme est en cours d'exécution, la première chose à faire est de définir
PATH
et toute autre variable requise (par exempleLD_LIBRARY_PATH
) aux valeurs requises pour que le script s'exécute.Fondamentalement, au lieu de réfléchir à la manière de modifier l'environnement cron pour le rendre plus adapté à votre programme / script, faites en sorte que votre script gère l'environnement qui lui est donné, en définissant un environnement approprié au démarrage.
la source
crontab
.Définir PATH juste avant la ligne de commande dans mon crontab a fonctionné pour moi:
la source
Ajouter une définition PATH dans le crontab utilisateur avec des valeurs correctes aidera ... J'ai rempli la mienne avec juste:
Et c'est suffisant pour que tous mes scripts fonctionnent ... Incluez-y n'importe quel chemin personnalisé si vous en avez besoin.
la source
/etc/crontab
. C'est la réponse la plus simple au niveau de l'utilisateur. Bon travail @ Treviño. Votez si vous êtes d'accord.Faites fonctionner vos variables pour vous, cela vous permettra d'accéder
Définissez votre PATH dans /etc/profile.d/*.sh
Variables d'environnement à l'échelle du système
Les fichiers avec l'extension .sh dans le répertoire /etc/profile.d sont exécutés à chaque fois qu'un shell de connexion bash est entré (par exemple lors de la connexion depuis la console ou via ssh), ainsi que par le DisplayManager lorsque la session de bureau se charge.
Vous pouvez par exemple créer le fichier /etc/profile.d/myenvvars.sh et définir des variables comme ceci:
Exécutez crontab avec l'option de connexion!
CRONTAB exécuter un script ou une commande avec des variables d'environnement
la source
Problème
Votre script fonctionne lorsque vous l'exécutez à partir de la console mais échoue dans cron.
Cause
Votre crontab n'a pas les bonnes variables de chemin (et éventuellement le shell)
Solution
Ajoutez votre shell actuel et accédez au crontab
Script pour le faire pour vous
La source
https://github.com/ssstonebraker/braker-scripts/blob/master/working-scripts/add_current_shell_and_path_to_crontab.sh
Exemple de sortie
la source
Sur mon AIX, cron récupère ses variables d'environnement de / etc / environment en ignorant ce qui est défini dans le .profile.
Edit: J'ai également extrait quelques boîtes Linux de différents âges et celles-ci semblent également avoir ce fichier, donc ce n'est probablement pas spécifique à AIX.
J'ai vérifié cela en utilisant la suggestion cron de joemaller et en vérifiant la sortie avant et après l'édition de la variable PATH dans / etc / environment.
la source
Si vous ne voulez pas avoir à effectuer les mêmes modifications à différents endroits, procédez à peu près comme suit:
Le . space, puis le chemin vers .bashrc et la commande && sont la magie pour obtenir les modifications de votre environnement dans le shell bash en cours d'exécution. Aussi, si vous voulez vraiment que le shell soit bash, c'est une bonne idée d'avoir une ligne dans votre crontab:
J'espère que cela aide quelqu'un!
la source
L'environnement par défaut des tâches cron est très rare et peut être très différent de l'environnement dans lequel vous développez vos scripts python. Pour un script qui peut être exécuté dans cron, tout environnement dont vous dépendez doit être défini explicitement. Dans le fichier cron lui-même, incluez les chemins complets vers les exécutables python et vers vos scripts python.
la source
Je sais que cela a déjà été répondu, mais j'ai pensé que le sien serait utile à certains. J'ai eu un problème similaire que j'ai récemment résolu ( trouvé ici ) et voici les points saillants des étapes que j'ai suivies pour répondre à cette question:
assurez-vous que vous avez les variables dont vous avez besoin dans PYTHONPATH (trouvées ici et ici et pour plus d'informations ici) dans le .profile ou .bash_profile pour tout shell dans lequel vous voulez tester votre script pour vous assurer qu'il fonctionne.
éditez votre crontab pour inclure les répertoires nécessaires pour exécuter votre script dans un travail cron (trouvé ici et ici)
a) assurez-vous d'inclure le répertoire racine dans la variable PATH (.) comme expliqué ici (fondamentalement, si vous exécutez un exécutable avec votre commande, il doit être en mesure de trouver root ou le répertoire où l'exécutable est stocké) et probablement ces (/ sbin: / bin: / usr / sbin: / usr / bin)
dans votre fichier crontab, créez un cronjob qui changera de répertoire vers le répertoire où vous avez exécuté avec succès le script auparavant (c'est-à-dire Users / user / Documents / foo)
a) Cela ressemblera à ce qui suit:
la source
@Trevino: votre réponse m'a aidé à résoudre mon problème. Cependant, pour un débutant, essayez de donner une approche étape par étape.
$ echo $JAVA_HOME
$ crontab -e
* * * * * echo $PATH
- cela vous permet de comprendre quelle est la valeur PATH actuellement utilisée par crontab. Exécutez crontab et récupérez la valeur $ PATH utilisée par crontab.crontab -e
; b)PATH=<value of $JAVA_HOME>/bin:/usr/bin:/bin
(c'est un exemple de chemin); c) maintenant votre travail / script planifié comme*/10 * * * * sh runMyJob.sh &
; d) retirerecho $PATH
de crontab car ce n'est pas nécessaire maintenant.la source
Définissez le PATH requis dans votre cron
Edit: Appuyez sur
i
Sauvegarder et quitter
:wq
la source
La solution de contournement la plus simple que j'ai trouvée ressemble à ceci:
Cet exemple invoque
su
tant qu'utilisateur root et démarre le shell avec l'environnement complet de l'utilisateur, y compris $ PATH, défini comme s'il était connecté. Il fonctionne de la même manière sur différentes distributions, est plus fiable que l'approvisionnement .bashrc (qui n'a pas fonctionné pour me) et évite de coder en dur des chemins spécifiques qui peuvent être un problème si vous fournissez un exemple ou un outil de configuration et que vous ne savez pas quelle distribution ou disposition de fichier sur le système de l'utilisateur.Vous pouvez également spécifier le nom d'utilisateur après
su
si vous voulez un utilisateur différent de root, mais vous devriez probablement laisser leroot
paramètre avant lasu
commande car cela garantit qu'ilsu
dispose de privilèges suffisants pour basculer vers n'importe quel utilisateur que vous spécifiez.la source
Si vous utilisez,
webmin
voici les étapes pour définir laPATH
valeur:la source