Une utilisation intelligente de la redirection d'E/S permet
d'analyser et de coudre ensemble de petits bouts de la sortie de commandes (voir Exemple 11-6). Ceci permet de générer des rapports et des
fichiers de traces.
Exemple 16-11. Enregistrer des événements
#!/bin/bash
# logevents.sh, by Stephane Chazelas.
# Tracer des événements dans un fichier.
# Vous devez être root pour exécuter ceci (pour avoir le droit d'écrire dans
#+ /var/log).
ROOT_UID=0 # Seuls les utilisateurs ayant l'identifiant $UID 0 ont les
#+ privilèges de root.
E_NONROOT=67 # Code de sortie si non root.
if [ "$UID" -ne "$ROOT_UID" ]
then
echo "Vous devez être root pour exécuetr ce script."
exit $E_NONROOT
fi
FD_DEBUG1=3
FD_DEBUG2=4
FD_DEBUG3=5
# Décommentez une des deux lignes ci-dessous pour activer le script.
# TRACE_EVENEMENTS=1
# TRACE_VARS=1
log() # Ecrit la date et l'heure dans le fichier de traces.
{
echo "$(date) $*" >&7 # Ceci *ajoute* la date dans le fichier.
# Voir ci-dessous.
}
case $NIVEAU_TRACES in
1) exec 3>&2 4> /dev/null 5> /dev/null;;
2) exec 3>&2 4>&2 5> /dev/null;;
3) exec 3>&2 4>&2 5>&2;;
*) exec 3> /dev/null 4> /dev/null 5> /dev/null;;
esac
FD_TRACEVARS=6
if [[ $TRACE_VARS ]]
then exec 6>> /var/log/vars.log
else exec 6> /dev/null # Bury output.
fi
FD_TRACEEVENEMENTS=7
if [[ $TRACE_EVENEMENTS ]]
then
# then exec 7 >(exec gawk '{print strftime(), $0}' >> /var/log/event.log)
# La ligne ci-dessus ne fonctionnera pas avec Bash, version 2.04.
exec 7>> /var/log/event.log # Ajoute dans "event.log".
log # Ecrit la date et l'heure.
else exec 7> /dev/null # Supprime le sortie.
fi
echo "DEBUG3: début" >&${FD_DEBUG3}
ls -l >&5 2>&4 # commande1 >&5 2>&4
echo "Done" # commande2
echo "envoi mail" >&${FD_LOGEVENTS} # Ecrit "envoi mail" sur fd #7.
exit 0 |