J'ai récemment dû réinstaller 10.9.5 (installation par défaut) et je constate maintenant que les bash scripts qui s'exécutent parfaitement depuis la ligne de commande (~/Me...) ne fonctionnent plus en utilisant crontab. J'utilise crontab pour invoquer "Diskutil unmount volumeX" mais je reçois un courrier de cron disant que la commande "diskutil" n'a pas été trouvée. S'agit-il d'un problème de PATH et si oui, comment puis-je le résoudre ? Merci d'avance pour toute aide.
Réponses
Trop de publicités?cron
utilise /usr/bin:/bin
par défaut PATH
y diskutil
est en /usr/sbin
.
Indiquez le chemin complet vers diskutil
ou ajouter une ligne comme PATH=/usr/bin:/bin:/usr/sbin:/sbin
au début de votre crontab.
Entrez which diskutil
pour trouver son chemin, ou entrez echo $PATH
pour trouver le chemin où vos commandes fonctionnent.
Question :
S'agit-il d'un problème de PATH et si oui, comment puis-je le résoudre ?
Réponse à la question "Est-ce un problème de PATH ?" :
Il s'agit très probablement d'un "problème de PATH". Mais le vrai problème est ne pas savoir la vraie valeur de $PATH
que cron
utilise. C'est la question que cette réponse abordera.
En tant qu'utilisateur de cron
une des choses que vous devez comprendre est que, bien que cron
exécute votre crontab
en votre nom et sous votre nom d'utilisateur, il le fait dans un autre contexte. environnement que vous ne le faites en tant qu'utilisateur "connecté".
La façon la plus simple de découvrir votre environnement est peut-être de lancer un travail à partir de cron
est de demander cron
pour vous le dire ! Cela se fait facilement comme suit :
% crontab -e
# in your editor, add the following line, then save & close your new crontab
* * * * * printenv > /Users/$USER/mycronenvironment.txt 2>&1
# now wait for the output:
% tail -f ~/mycronenvironment.txt
Vous voudrez arrêter cela sous peu, alors modifiez et enregistrez votre crontab
. Votre résultat ressemblera à ceci :
SHELL=/bin/sh
USER=seamus
PATH=/usr/bin:/bin
PWD=/Users/seamus
SHLVL=1
HOME=/Users/seamus
LOGNAME=seamus
_=/usr/bin/printenv
Notez le PATH
La variable est limitée à /usr/bin
& bin
. Donc - votre cron
l'emploi sera nulle part ailleurs pour un fichier. Vous souhaitez maintenant comparer cette environnement contre celui de votre connexion interactive coquille. Il suffit d'exécuter printenv
à partir de votre shell de connexion ( zsh
sur les Macs de modèle ultérieur) :
% printenv
...
PATH=/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/VMware Fusion.app/Contents/Public:/Library/Apple/usr/bin
...
Cette différence dans le PATH
variables d'environnement explique la source d'une erreur "commande inconnue" générée par cron
: la commande n'est pas sur l PATH
du shell utilisé par cron
.
Réponse à la question "Comment puis-je réparer ça ?" :
En général, il existe deux méthodes :
-
Utilisez un chemin complet pour tout ce qui se trouve dans votre
crontab
Par exemple :
/usr/sbin/diskutil unmount volumeX
-
Définir (re-définir)
PATH
dans votrecrontab
Et comme d'habitude, il existe de nombreuses façons de le faire. Si vous voulez utiliser votre "utilisateur connecté"
PATH
comme lePATH
pour votre "utilisateur cron" :% echo $PATH /opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/VMware Fusion.app/Contents/Public:/Library/Apple/usr/bin % crontab -e # copy and paste the $PATH string at the top of the file as follows: PATH=/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/VMware Fusion.app/Contents/Public:/Library/Apple/usr/bin # save & close your `crontab` # you can re-activate the `printenv` cron job again to verify the new path
A variation sur cette approche pourrait être la suivante :
-
Créez un fichier nommé (par exemple)
~/.cronpath
-
Mettez une seule ligne dans ce fichier :
PATH=/usr/bin:/bin:<other folders>
où <autres dossiers> est une liste de dossiers séparés par deux points que vous souhaitez ajouter au dossier par défaut.PATH
. -
Source du fichier
~/.cronpath
au redémarrage dans votrecrontab
:@reboot . /Users/$USER/.cronpath
...
remainder of crontab entries
-