Où sont enregistrées les erreurs cron?

Si je configure mal les tâches cron , elles semblent échouer silencieusement. Où devrais-je chercher un journal des erreurs pour comprendre ce qui s'est passé?

Comme d'autres l'ont fait remarquer, cron enverra le résultat de n'importe quel programme qu'il exécute (s'il y a une sortie). Donc, si vous n'obtenez pas de sortie, il y a essentiellement trois possibilités:

  1. crond n'a même pas pu démarrer un shell pour lancer le programme ou envoyer des emails
  2. crond eu des problèmes pour envoyer la sortie, ou le courrier a été perdu.
  3. le programme n'a produit aucune sortie (y compris les messages d'erreur)

Cas 1. est très improbable, mais quelque chose aurait dû être écrit dans les journaux cron. Cron a une propre fonction syslog réservée, vous devriez donc jeter un coup d'oeil dans /etc/syslog.conf (ou le file équivalent dans votre distro) pour voir où les messages de cron sont envoyés. Les destinations populaires incluent /var/log/cron , /var/log/messages et /var/log/syslog .

Dans le cas 2, vous devriez inspecter les logs du démon du mailer: les messages du démon Cron apparaissent généralement à partir de root@yourhost . Vous pouvez utiliser une ligne MAILTO=... dans le file crontab pour que cron envoie un courrier électronique à une adresse spécifique, ce qui devrait faciliter la grep des journaux du démon de publipostage. Par exemple:

 MAILTO=my.offsite.email@example.org 00 15 * * * echo "Just testing if crond sends email" 

Dans le cas 3, vous pouvez tester si le programme a réellement été exécuté en ajoutant une autre command dont vous pouvez vérifier facilement l'effet: par exemple,

 00 15 * * * /a/command; touch /tmp/a_command_has_run 

afin que vous puissiez vérifier si crond a effectivement exécuté quelque chose en regardant le mtime de /tmp/a_command_has_run .

Si vous ne voyez pas les mails, vous pourriez spammer root @ yourcompany avec les erreurs qui peuvent être assez gênantes pour les personnes qui utilisent ce count pour la surveillance. Essayez d'envoyer la sortie à Syslog à la place:

 */5 * * * * yourcronjob 2>&1 | /usr/bin/logger -t yourtag 

Ensuite, attendez que le cronjob s'exécute et searchz l'erreur dans / var / log / messages (ou /var/log/user.log sur certains systèmes).

Cela fonctionne très bien pour les messages d'erreur qui ne sont que de 1-2 lignes, comme "yourcronjob: command not found". Il utilise également votre infrastructure syslog existante (Logrotation, syslogging central, Splunk, etc.). Il réduit également les spams envoyés par courrier électronique à root.

Il peut ne pas être une bonne solution si votre cronjob génère des centaines de lignes de sortie.

Vous pouvez toujours envoyer explicitement la sortie du travail à un file journal:

 0 8 * * * /usr/local/bin/myjob > /var/log/myjob.log 2>&1 

Gardez à l'esprit que cela replacea le comportement de messagerie mentionné précédemment, car crond iself ne recevra aucune sortie du travail. Si vous voulez garder ce comportement, vous devriez regarder dans le tee (1).

La configuration par défaut de cron vous enverra un courrier avec la sortie de votre programme. Si cela échoue, vous pouvez essayer d'encapsuler votre programme défaillant dans un script shell qui garantit que le programme n'échoue pas et vous pouvez en outre save la sortie.

Ceci est un paramètre configurable sur certaines implémentations cron.

Vous devriez recevoir un courrier électronique de crond lorsque le travail ne s'exécute pas ou lorsque le travail renvoie un code de sortie différent de zéro. Essayez de taper:

 $ mailx 

à l'invite de command.

mailx(1) est le programme de base de lecture du courrier sur la plupart des systèmes Unixlike. Il est très primitif selon les normes modernes, mais vous pouvez countr sur cela pour toujours être disponible. D'autres agents de courrier, mieux, peuvent être disponibles, mais il y en a assez que vous ne savez jamais lequel est installé sur une machine random que vous utilisez.

Notez que, sauf si vous avez configuré votre système en tant que server de messagerie Internet, ce sous-système de messagerie est utilisé uniquement dans la machine. Vous pouvez envoyer des e-mails aux autres users de la machine et les recevoir, mais vous ne pourrez peut-être pas envoyer d'e-mails au monde et les e-mails provenant du monde extérieur ne pourront certainement pas arriver sur votre machine.

Cron consigne les informations de base dans /var/log/messages , mais envoie les sorties de programme à l'user appelant.

J'ai trébuché sur ce fil il y a quelques années rencontrant les mêmes problèmes et vient de find une solution aux cas mentionnés ci-dessus par Ricardo. Le manque de courrier électronique est difficile à détecter (comme vous l'avez mentionné) et vous ne voulez certainement pas spammer vos emails root @ yourcompany. Si vous êtes intéressé, consultez deadmanssnitch.com. . Cet outil semble résoudre les cas susmentionnés. Semble assez simple à utiliser – il suffit d'append le peu de code que l'outil vous donne à votre cronjob. Si votre travail ne s'exécute pas à un niveau interne spécifié, vous serez averti. Si votre travail recommence à fonctionner, vous serez également alerté.

J'utilise vixie-cron , donc je ne sais pas si cela s'applique à tout. Mais j'ai un file dead.letter qui contient toute la sortie du travail.

Dans mon dossier /root/ j'ai crons.cron que j'ai défini comme crontab en exécutant crontab /root/crons.cron . dead.letter sera créé dans /root/ aussi.

Edit j'ai juste Google dead dead.letter , et c'est un courrier non dissortingbuable. Cela n'a rien à voir avec cron apparemment. Si vous n'avez pas configuré le courrier correctement (comme moi), vous aurez le file.