Le script Cron ne s'exécute pas sur Mavericks

12

J'ai configuré un fichier crontab utilisateur comme suit:

*/2 * * * * /Users/[my user]/Dropbox/htdocs/auto-update.sh

Mais il ne s'exécutera pas. J'ai attendu 10 à 15 minutes. Pourquoi?

La commande auto-update.sh s'exécute facilement si elle est exécutée manuellement. Comment puis-je briser la chaîne d'exécution et lancer mon script à partir de cron?

RomaValcer
la source
1
Quel système d'exploitation utilisez-vous? Cron est obsolète sur OS X, vous devrez donc peut-être démarrer le démon?
bmike
Dernière version, 10.9.2. Comment fait-on ça? Je veux juste qu'un script fonctionne toutes les heures, par exemple. Dans le script ci-dessus, j'étais désespéré car cela ne fonctionnait pas et je l'ai modifié pour qu'il fonctionne toutes les 2 minutes.
RomaValcer
1
Le démon cron doit être démarré automatiquement (par son remplacement, launchd) s'il existe un fichier crontab. Voir /System/Library/LaunchDaemons/com.vix.cron.plist (en particulier les éléments KeepAliveet QueueDirectories).
Gordon Davisson
OK, Keeplive est là, mais seul le chemin répertorié est '/ etc / crontab' qui n'existe pas. Dans QueueDirectories, il existe un fichier existant dans le dossier restreint '/ usr / lib / cron / tabs'. Lorsque je l'ouvre avec su et vim, il y a ma tâche.
RomaValcer

Réponses:

17

L'environnement dans lequel un travail cron s'exécute est assez différent d'un shell interactif; il est probable que le script s'exécute, mais pas avec succès. L'une des plus grandes différences est que pour les tâches cron, le CHEMIN par défaut est juste "/ usr / bin: / bin", donc si vous utilisez des commandes qui ne sont pas dans / usr / bin ou / bin, elles ne seront pas trouvé sauf si votre script définit son propre CHEMIN ou fournit des chemins explicites aux commandes. L'autre grande différence est simplement qu'il n'est pas connecté à une session interactive, donc s'il essaie de faire quelque chose d'interactif (lu depuis le terminal, etc.) qui échouera. Essayez de modifier l'entrée cron en:

*/2 * * * * /Users/[my user]/Dropbox/htdocs/auto-update.sh >>/tmp/auto-update.log 2>&1

... et voyez si quelque chose d'informatif apparaît dans le journal.

Gordon Davisson
la source
C'est mieux que mes efforts - n'hésitez pas à incorporer mon idée d'enregistreur si cela améliore votre réponse.
bmike
Le journal n'apparaissait tout simplement pas.
RomaValcer
@RomaValcer: c'est étrange - cela signifie qu'il ne va même pas jusqu'au lancement du script. Je courrais ps -ax | grep [c]ronet verrais s'il répertorie le démon cron (/ usr / sbin / cron) en cours d'exécution. Si c'est le cas, essayez le test de l'enregistreur de bmike. Dans tous les cas, vérifiez les journaux (/var/log/system.log et l'élément "Tous les messages" dans l'utilitaire de console) et voyez s'il y a quelque chose de pertinent.
Gordon Davisson
Ouais, c'est là. Mais les journaux ne montrent rien qui commence à l'heure prévue.
RomaValcer
4

C'est difficile à dire, mais que se passe-t-il si vous ajoutez un deuxième travail cron à exécuter toutes les 5 minutes environ et faites-le appeler un outil construit par le système qui enregistre les messages dans system.log?

0,5,10,15,20 * * * * /usr/bin/logger "cron is working"

De cette façon, vous saurez que cron est en cours d'exécution pour l'utilisateur en question et pouvez vous concentrer sur le démarrage de cron ou la correction de votre script pour qu'il s'exécute dans l'environnement cron limité. (Vous pouvez regarder l'horloge murale et en choisir quelques-unes qui arriveront bientôt ou même les prochaines minutes - par exemple, éditer à 12:34 mettre 35,36,37,38 pour les minutes à exécuter et enregistrer le fichier cron .)

bmike
la source
4

Cela fait un moment que vous posez cette question, mais il semble qu'aucune solution ne soit apparue dans ce fil.

Selon la façon dont vous créez un utilisateur-crontab, il peut être nécessaire de l'exécuter après l'avoir modifié:

crontab ~/.yourcrontabfile

Pour voir si le nouveau crontab (également après l'avoir modifié) a été activé, vérifiez avec:

crontab -l
Ben
la source
Ça ne marche pas. Crontab -l montre que les crons sont configurés, mais cela ne fonctionne toujours pas.
PKHunter
1

J'ai eu le même problème. Vous devez ajouter le chemin d'accès à votre script bash:

#!/bin/sh
PATH=/usr/local/bin:/usr/local/sbin:~/bin:/usr/bin:/bin:/usr/sbin:/sbin
Ivan Zhirkov
la source
0

J'ai eu le même problème. Il a disparu après avoir ajouté une nouvelle ligne après mon travail dans mon fichier crontab (je suis un total crontab n00b, donc je n'ai aucune idée si ce comportement est largement connu ou non).

RMD
la source