De l'art de surveiller les scripts...

Écrire un script, c'est bien, mais, si le script est lancé automatiquement, il est judicieux de disposer d'un journal permettant de s'assurer de son bon fonctionnement[1]...

J'ai mis en place il y a peu un script chargé d'apprendre à spamassassin à reconnaître des messages indésirables. Ce script lance la commande sa-learn, et pour savoir s'il fonctionne bien, je veux savoir ce qu'a affiché sa-learn.

La commande logger

Pour enregistrer un message dans le journal système (/var/log/syslog[2] sur une distribution Débian), on peut utiliser une commande très pratique : logger.

Par exemple :

logger -p user.info -t mon_script "Mon message"

fera apparaître le message suivant dans le journal système :

Jun 21 22:12:24 mon_serveur mon_script: Mon message
Un premier essai

Il suffit donc de prendre les messages affichés par sa-learn et de les envoyer à logger :

MA_SORTIE="$( sa-learn --spam "${FICHIER}" 2>&1 )"
logger -p user.info -t mon_script "Resultat : ${MA_SORTIE}"

Cependant, nous ne pouvons pas être sûr que sa-learn renverra une seule ligne[3].

La même chose... En mieux

Le plus simple serait de fusionner les lignes affichées par sa-learn avant de les enregistrer dans le journal[4].

Ce que l'on peut faire simplement une ligne de awk :

sa-learn --spam "${FICHIER}" 2>&1 | gawk -v ORS="" 'NR > 1 { print " -/- " } ; { print }'

Donc, au bout du compte, c'est tout simple :

RESULTAT_COMMANDE="$( sa-learn --spam "${FICHIER}" 2>&1 | gawk -v ORS="" 'NR > 1 { print " -/- " } ; { print }' )"
logger -p user.info -t mon_script "sa-learn => ${RESULTAT_COMMANDE}"

En deux lignes, on lance sa-learn et on renvoie son résultat dans le journal système.

Notes

[1] Les programmes informatiques sont comme ça, si personne ne les surveille, ils font n'importe quoi.

[2] Le fichier journal utilisé dépendra du paramétrage du démon syslogd, de la priorité choisie (ici, info) et de la catégorie du message (ici, user)

[3] En général, les messages des journaux systèmes sont sur une seule ligne, ce qui permet de les exploiter simplement avec des outils Unix comme grep et logcheck.

[4] Attention ! On parle ici de fusionner une ou deux lignes, pas plus.