0 votes

Obtention d'une erreur de commande inconnue en essayant d'exécuter script via cron.

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.

2voto

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.

0voto

Seamus Points 3171

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 :

  1. Utilisez un chemin complet pour tout ce qui se trouve dans votre crontab

    Par exemple : /usr/sbin/diskutil unmount volumeX

  2. Définir (re-définir) PATH dans votre crontab

    Et comme d'habitude, il existe de nombreuses façons de le faire. Si vous voulez utiliser votre "utilisateur connecté" PATH comme le PATH 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 votre crontab :

      @reboot . /Users/$USER/.cronpath

      ...

      remainder of crontab entries

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X