É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.