Pourquoi mon crontab n'a pas déclenché?

J'ai utilisé crontab -e pour append la ligne suivante à mon crontab:

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

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

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

Edit – Ask Ubuntu a une bonne question à propos de crontab , malheureusement cela ne m'aide toujours pas.

Edit 2 – Hmm, il semble que mon file de test a 214 lignes, ce qui signifie 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 est parti.

Il y a des implémentations de cron (pas toutes, et je ne me souviens pas de quoi, mais j'en ai rencontré une sous Linux) qui vérifie les files crontab mis à jour toutes les minutes et ne considère pas les nouvelles inputs avant la prochaine minute. Par conséquent, un crontab peut prendre jusqu'à deux minutes pour démarrer pour la première fois. C'est peut-être ce que vous avez observé.

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

J'ai eu le même problème – un crontab de travail soudainement arrêté après avoir ajouté une nouvelle input à 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 émettant la command

 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'logging ont résolu le problème.

On dirait que c'est fixe. La prochaine fois, essayez d'save le STDERR. Ce qui suit ne se connecte à STDOUT, pas STDERR:

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

Essayez de vous assurer qu'il existe une clause explicite pour STDERR. Dans le cas contraire, STDERR peut être envoyé par courrier électronique à l'user (en supposant que le courrier électronique fonctionne) ou ne peut aller nulle part, selon la configuration de Cron.

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

Ma preference est d'envoyer la sortie cronjob à syslog. De cette façon, je profite de toute infrastructure syslog existante (syslogs centralisés, Splunk, rotation de journal déjà prise en charge, il est facile de comparer les messages dans / var / log / messages / var / log / cronjob, etc.) spamming les sysadmins (moi) avec des e-mails inutiles.

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

Votre ligne cron fonctionne bien sur mon ordinateur quand je change myusernae en phunehehe . Il y a plusieurs façons de découvrir ce qui ne va pas avec votre système.

Cron envoie généralement un courrier à l'user quand il y a un problème. Si vous voyez le message "Vous avez un courrier", utilisez un client de messagerie pour vérifier votre boîte de réception . Ou, vérifiez dans votre directory personnel, il peut y avoir un file nommé dead.letter .

Vous pouvez vérifier /var/log/ pour les inputs relatives à cron. Sur mon ordinateur, le file journal est à /var/log/cron/current (nécessite un access root).

Si vous avez un access root, vous pouvez arrêter le démon cron et le démarrer en mode debug. Par exemple, je voudrais utiliser (changer fcron au nom de votre démon):

 killall fcron fcron --foreground --debug 

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

Une bonne façon d'get les erreurs de votre crontab par courrier est de faire ressembler votre crontab à ceci:

 MAILTO="[email protected]" * * * * * echo hi >> /home/myusernae/test 

Évidemment, utilisez votre adresse e-mail plutôt que [email protected]. Cela indique à cron d'envoyer des erreurs à votre adresse e-mail plutôt qu'au count local. Ceci est particulièrement utile si vous avez un root crontab (ou un fragment crontab dans /etc/cron.d) que vous voulez simplement envoyer, vous pouvez éviter de spammer la boîte aux lettres de la racine ou l'adresse de retransmission de la racine.

Avec moi, le problème était que le script n'était pas exécutable. J'ai eu crontab -e installation comme ça

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

Et le file myscript n'était pas exécutable alors j'ai couru

 chmod +x my-script.sh 

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

Je suppose qu'une des raisons peut être que le directory / home / est crypté et que l'user est déconnecté cron est incapable de faire quoi que ce soit dans ce directory.

voir: https://stackoverflow.com/a/40354269/1279002