Pourquoi mon crontab ne s'est-il pas déclenché?


29

J'avais l'habitude crontab -ed'ajouter la ligne suivante à mon crontab:

* * * * * echo hi >> /home/myusername/test

Pourtant, je ne vois pas que le fichier de test est écrit. Est-ce un problème d'autorisation ou crontab ne fonctionne-t-il pas correctement?

Je vois que le processus cron est en cours d'exécution. Comment puis-je déboguer cela?

Edit - Ask Ubuntu a une belle question sur crontab , malheureusement cela ne m'aide toujours pas.

Edit 2 - Hmm, il semble que mon fichier de test ait 214 lignes, ce qui signifie que pour les 214 dernières minutes, il a été écrit à chaque minute. Je ne sais pas quel était le problème, mais il est évident qu'il a disparu.

Réponses:


23

Il y a des implémentations de cron(pas toutes, et je ne me souviens pas laquelle, mais j'en ai rencontré une sous Linux) qui vérifient les fichiers crontab mis à jour chaque minute à la minute, et ne considèrent pas les nouvelles entrées jusqu'à la minute suivante . Par conséquent, un crontab peut prendre jusqu'à deux minutes pour se déclencher pour la première fois. C'est peut-être ce que vous avez observé.


1
Je suppose que Solaris, ou peut-être Solaris au début. J'ai l'habitude de faire exécuter l'entrée cron de 3 à 5 minutes dans le futur lorsque je teste un script à partir d'une entrée crontab, car je me trompais tout le temps avec ce comportement.
Bruce Ediger

fcronfait cela aussi.
phunehehe

Et si la routine de «vérification» coûte plus de quelques minutes? Il y aura des cronjobs qui devraient être déclenchés lors de cette longue «vérification» qui n'ont pas été déclenchés.
ospider

@ospider Le chèque ne prend qu'une fraction de seconde.
Gilles 'SO- arrête d'être méchant'

28

Avez-vous ajouté une ligne vide après votre cronjob ?


Il y a une ligne vide après mon cronjob.
ripper234

4
Pas une ligne vide, mais une nouvelle ligne à la fin de la dernière ligne. Un fichier texte est censé être composé d'une séquence de lignes, chacune terminée par une nouvelle ligne, de sorte que tout fichier texte non vide se termine par un caractère de nouvelle ligne. Certains utilitaires ne traitent rien après la dernière nouvelle ligne d'un fichier.
Gilles 'SO- arrête d'être méchant'

1
C'est une question de termes, "caractère de nouvelle ligne" signifie "après que ce caractère commence une nouvelle ligne de texte". Donc, 0 octet entre la dernière nouvelle ligne et l'EOF peut également être considéré comme une ligne vide ("ligne qui contient 0 caractères")
gelraen

10

J'ai eu le même problème - un crontab de travail s'est soudainement arrêté après avoir ajouté une nouvelle entrée à la fin. Il s'est avéré que j'avais oublié de mettre une nouvelle ligne après cette dernière ligne.

J'ai découvert en lançant la commande

cat /var/log/syslog | grep crontab

et la sortie a montré le problème:

Jul  2 08:16:01 shiva cron[1254]: (*system*) RELOAD (/etc/crontab)
Jul  2 08:16:01 shiva cron[1254]: (*system*) ERROR (Missing newline before EOF, this crontab file will be ignored)

L'ajout de la nouvelle ligne et l'enregistrement ont résolu le problème.


5

Cela semble fixe. La prochaine fois, essayez également de connecter le STDERR. Les éléments suivants ne se connecteront qu'à STDOUT, pas à STDERR:

* * * * * echo hi >> /home/myusername/test

Essayez de vous assurer qu'il existe également une clause explicite pour STDERR. Sinon, STDERR peut être envoyé par e-mail à l'utilisateur (en supposant que l'e-mail fonctionne) ou ne peut aller nulle part, selon la configuration de Cron.

* * * * * echo hi >> /home/myusername/test 2> /home/myusername/test.stderr

Ma préférence est d'envoyer la sortie cronjob à syslog. De cette façon, je profite de toute infrastructure syslog existante (syslog centralisés, Splunk, rotation des journaux déjà prise en charge, il est facile de comparer les messages dans / var / log / messages & / var / log / cronjob, etc.), et je ne le suis pas spammer les administrateurs système (moi) avec des e-mails inutiles.

* * * * * echo hi >> /home/myusername/test 2>&1 | /usr/bin/logger -t mycronjob

2

Pour moi, le problème était que le script n'était pas exécutable. J'avais une configuration crontab -e comme celle-ci

* * * * * /bin/my-script.sh

Et le fichier myscript n'était pas exécutable donc j'ai couru

chmod +x my-script.sh

Immédiatement, j'ai commencé à voir la sortie comme prévu.


1

Votre ligne cron fonctionne bien sur mon ordinateur lorsque je passe myusernaeà phunehehe. Il existe plusieurs façons de découvrir ce qui ne va pas avec votre système.

Cron envoie généralement des messages à l'utilisateur en cas de problème. Si vous voyez le message "Vous avez du courrier", utilisez un client de messagerie pour vérifier votre boîte de réception . Ou, vérifiez dans votre répertoire personnel, il peut y avoir un fichier nommé dead.letterlà-bas.

Vous pouvez vérifier les /var/log/entrées relatives à cron. Sur mon ordinateur, le fichier journal est à /var/log/cron/current(nécessite un accès root).

Si vous avez un accès root, vous pouvez arrêter le démon cron et le démarrer en mode débogage. Par exemple, j'utiliserais (changer fcronle nom de votre démon):

killall fcron
fcron --foreground --debug

Comment connaître le nom de mon démon?
ripper234

@ ripper234 use ps -ef | grep cronet vous devriez voir une ligne pour votre cron. Consultez la page de manuel du cron pour voir l'indicateur de débogage. Il est probable que vous utilisez Vixie Cron , dans ce cas, le drapeau de débogage est -x. Tuez le processus cron et redémarrez-le avec le drapeau supplémentaire.
phunehehe

Vérifiez également / var / log / syslog. Dans mon cas, il y avait des avertissements que le fichier cron était accessible en écriture de groupe.
traitez bien vos mods du

1

Très probablement, lorsque cron échoue, il génère un e-mail à l'ID utilisateur du travail cron sur cet ordinateur. Si aucun MTA ne fonctionne sur votre ordinateur ou si vous ne lisez pas ou ne transférez pas ce courrier ailleurs, vous ne verrez pas ce message, même si le MTA fonctionne.

Un bon moyen d'obtenir les erreurs de votre crontab par courrier est de faire ressembler votre crontab à ceci:

MAILTO="myemail@example.com"
* * * * * echo hi >> /home/myusernae/test

De toute évidence, utilisez votre adresse e-mail plutôt que myemail@example.com. Cela indique à cron d'envoyer des erreurs à votre adresse e-mail plutôt qu'au compte local. En particulier, cela est utile si vous avez une crontab racine (ou un fragment crontab dans /etc/cron.d) que vous souhaitez simplement vous envoyer une sortie, vous pouvez éviter de spammer la boîte aux lettres de la racine ou l'adresse de transfert de la racine.


Je ne sais pas si le système a un serveur de messagerie SMTP / sortant configuré. Il y a de fortes chances que ce ne soit pas le cas.
ripper234

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.