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:
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?
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
.
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
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
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é.
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.