Citation
Looki
Bonjour,
Je souhaite pouvoir récupérer dans une variable la
dernière ligne d'une log à chaque nouvelle
écriture de cette dernière.
Ceci en shell bash.
J'ai essayé plusieur truc du style :
toto=`tail -n 1 -f $log`
mais je ne parviens pas à avoir ce que je
souhaite.
Merci d'avance pour toute aide.
a+
Citation
nicola
Personnellement j’ai choisi une autre solution :
j’ai ajouté une ligne *.* |/dev/alllog (qui est un
tube nommé) dans /etc/syslog.cong, et ensuite
j’affiche avec une boucle infinie cat /dev/alllog.
--
La seule excuse de Dieu est qu’il n’existe pas.
Stendhal
Citation
cancerus
En fait, l'option -f conserve le tail ouvert.
C'est à dire que tant que tu ne le killes pas, le
tail attend les infos et les affiche dès que le
fichier est modifié. Le problème réside dans le
fait que si tu mets ce genre d'option dans un
shell, le dit shell va rester bloquer sur ta ligne
toto=`tail -n 1 -f $log`.
le mieux serait peut être donc de faire un shell
où tu bannis le '-f' mais qui va scanner ton
fichier de log régulièrement (facilement
réalisable via la crontab).
Ou alors, toujours en te passant de l'option '-f',
tu fais une boucle infinie qui fait un tail de la
dernière ligne et effectue le traitement de ta
variable.
Sinon tu as la solution de Nicola.
while [ 1 ] do read -r -n 1 -t 3 char # time-out sur entrée standard if [ $? = 1 ] then if [ -n "$chaine" ] then # on traite la partie de chaine reçue mode=`echo -n "$chaine" | ( exec 3>&1; gawk -v newline=0 -v mode=$mode -v equip=$file -v nbc ol=$nbcol -v term=$terminal -f /usr/bin/${filter}.awk 2>&1 1>&3 3>&- | logger -p local0.err 3>&- 1>&2 )` chaine="" fi else # caractere null c'est la fin de ligne on imprime if [ -n "$char" ] then chaine=$chaine$char else mode=`echo "$chaine" | ( exec 3>&1; gawk -v newline=1 -v mode=$mode -v equip=$file -v nbcol= $nbcol -v term=$terminal -f /usr/bin/${filter}.awk 2>&1 1>&3 3>&- | logger -p local0.err 3>&- 1>&2 ) ` chaine="" fi fi done