Blog

Comment logguer la sortie d'un script en cron

Écrit le 08 02 2013 par Kévin MET _

Imaginons que vous ayez un script de backup qui se lance tous les jours à 03h00 et que celui-ci renvoie des echos pour dire ce qu'il se passe pendant la sauvegarde. Lorsque vous lancez ce script directement dans un shell, vous pouvez observez ce qu'il se passe mais lorsque vous le lancez en cron, vous ne pouvez alors rien savoir de ce qu'il c'est exactement passé sauf si vous lisez vos mails de cron mais qui s'amuse à faire ça quand on en reçoit des dizaines par jour ? 😃

Au mieux, vous pouvez voir que votre script a bien été exécuté en allant voir les logs dans /var/log/cron.

Exemple:


# tail /var/log/cron

Aug 21 16:17:01 ks309 /USR/SBIN/CRON[11823]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Aug 21 17:17:01 ks309 /USR/SBIN/CRON[16891]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Aug 21 18:17:01 ks309 /USR/SBIN/CRON[21977]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Aug 21 19:17:01 ks309 /USR/SBIN/CRON[27080]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Aug 21 20:17:01 ks309 /USR/SBIN/CRON[32469]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)

Si vous n'avez pas de fichier /var/log/cron vous pouvez essayer de voir dans syslog en greppant sur cron. Exemple :


# grep -i cron /var/log/syslog

Aug 21 16:17:01 ks309 /USR/SBIN/CRON[11823]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Aug 21 17:17:01 ks309 /USR/SBIN/CRON[16891]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Aug 21 18:17:01 ks309 /USR/SBIN/CRON[21977]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Aug 21 19:17:01 ks309 /USR/SBIN/CRON[27080]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Aug 21 20:17:01 ks309 /USR/SBIN/CRON[32469]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)

Les valeurs que nous indiquent ces logs sont les suivantes :

La date, le nom d'hôte (ks309), le binaire que le cron utilise et le pid du cron, le user avec lequel le cron est lancé et la commande qui est passée.

Pour pallier à ce problème, il existe 3 solutions. La première consiste à modifier votre script en renvoyant tous les echos vers un fichier de log.


echo "La base de donnée truc est sauvegardée"

devient :


echo "La base de donnée truc est sauvegardée" >> /var/log/backup.log

Cette méthode n'est pas la plus pratique si votre script est long (et si vous êtes feignant). De plus ça ne vous permettra pas de récupérer les erreurs.

La deuxième méthode consiste simplement à appelé son script de façon à ce qu'il renvoit les sorties standard et erreur dans un fichier de log. Celle ci c'est la méthode méga feignasse car on ne touche pas au script.

Pour cela il suffit d'éditer son cron pour le faire ressembler à cela :


00 03 * * *  root /opt/scripts/backup.sh > /var/log/backup.log 2>&1

Dans cette ligne le > indique que l'on renvoie la sortie standard dans le fichier /var/log/backup.log. Le 2>&1 indique que la sortie d'erreur est redirigée vers la sortie standard qui elle même est redirigée vers le fichier de log. Du coup, tout vas dans /var/log/backup.log et vous savez ce qu'il s'est passé durant votre backup sans modifier votre script.

La troisième solution est selon moi la meilleure et c'est celle que j'utilise le plus souvent dans mes scripts bash. Il faut utiliser exec pour renvoyer les sorties standards et d'erreur dans un fichier de logs. En début de script, il suffit d'ajouter :


LOG="/var/log/mysql_backup.log"
ERROR_LOG="/var/log/mysql_backup_error.log"
exec 1> $LOG
exec 2> $ERROR_LOG

Vous pouvez ensuite faire comme si de rien n'était et les erreurs iront dans /var/log/mysql_backup_error.log tandis ce que la sortie standard ira dans le fichier /var/log/mysql_backup.log

♥ Partage sur tes réseaux sociaux ♥
Kévin MET
Kévin MET

Auteur de ce blog et gérant de la société MNT-TECH, je publie sur ce blog lorsque le temps me le permet et lorsqu'un sujet qui me parait intéressant n'a pas encore été abordé en français. Toutes les informations techniques présentes sur cette page peuvent être réutilisées moyennant le fait de citer la source.