web-dev-qa-db-fra.com

Débogage des tâches crontab

J'ai ajouté une entrée de crontab sur un serveur Linux qui exécutera un exécutable Java. Le code Java utilise sa propre classe pour consigner les erreurs et les messages dans un fichier journal.

Mais lorsque j'ai vérifié le fichier journal après l'heure prévue, aucun message n'a été enregistré. Au moins un message du journal aurait dû indiquer que l'exécution avait commencé.

Donc, il y a deux causes possibles:

  1. Le code est exécuté mais ne s'est pas connecté.
  2. Ou bien, le code ne s'est pas exécuté du tout.

Le fichier journal spécifié a les autorisations chmod 777. Je suppose donc que c'est la deuxième cause ici.

Pourquoi un travail crontab ne s'exécute-t-il pas à l'heure programmée? Et comment puis-je déboguer ceci sans aucune sorte de journalisation?

J'ai lu que s'il y avait une erreur cron envoie un email à l'utilisateur. Comment savoir quelle adresse électronique est associée à l'utilisateur?

36
naiquevin

Vous pouvez activer la journalisation pour les tâches cron afin de suivre les problèmes. Vous devez éditer le fichier /etc/rsyslog.conf or /etc/rsyslog.d/50-default.conf (sur Ubuntu) et vous assurer que la ligne suivante n'est pas commentée, ou l'ajouter si elle manque:

cron.*                         /var/log/cron.log

Puis redémarrez rsyslog et cron:

Sudo service rsyslog restart
Sudo service cron restart

Les tâches cron se connecteront à /var/log/cron.log.

48
Mehdi Yedes

Ajoutez 2> & 1 à la fin de votre commande Crontab. Cela redirigera la sortie stderr vers la sortie standard. Assurez-vous ensuite que vous enregistrez la commande Unix de la crontab.

0 0,12 1 */2 * /sbin/ping -c 192.168.0.1; ls -la >>/var/log/cronrun 2>&1

Cela capturera quelque chose de la commande Unix.

Quelques astuces supplémentaires (après avoir aidé un collègue l’autre jour ...). Ecrivez les variables d'environnement en émettant le jeu de commandes sans paramètre. Et faites en sorte que le shell répète chaque commande avec la commande set -x. Au sommet de votre problème de script;

set
set -x
27
Karl

En supposant que l’exécution manuelle de la commande fonctionne, mais pas dans Cron, il se peut que le chemin correct ne soit pas exposé à la commande cron. Vous pouvez résoudre ce problème en exécutant crontab -e puis en entrant le chemin directement dans l'onglet cron:

# Export the path so that the scripts run correctly PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin

1
user189271

Vérifiez si vous avez vraiment formaté le moment où il doit bien fonctionner.

Par exemple au lieu de 

*/1 * * * * echo 'debug' > /home/glab/change_branch.log

pourrait être ceci:

1 * * * * echo 'debug' > /home/glab/change_branch.log

et vous pouvez vous attendre à ce qu'il fonctionne toutes les minutes. Et aussi aucun journal n'est généré.

0
Darius.V

Votre problème est peut-être dû au fait que cron (du moins dans la distribution que j'utilise, Amazon Linux) considère que les heures sont en UTC. Par conséquent, si vous êtes dans un fuseau horaire différent (par exemple -03: 00) Attendez-vous à le faire fonctionner 3 heures à l’avance, et vous n’aurez aucun problème.

0
Renato Gama