Newsgroup: it.comp.os.linux.development
Titolo: Script cattura ultime righe di un log..

Ciao
Avrei la necessità di catturare le ultime righe di un file di log (di 
hylafax) e farle processare da un secondo script (che effettua alcune 
modifiche e le inserisce in una base dati).
Non so bene come fare, non ho mai creato uno script bash in questo 
modo.. So che è possibile accedere alle ultime righe dal file cambiate 
con tail -f, ma come richiamo uno script ad ogni riga aggiunta (hylafax 
scrive una riga per ogni operazione)?
E se le righe poi arrivano tutte insieme e non una alla volta?
FF

 writes:

invece di uno script scrivi un programmino; apri il log, leggi una
linea per volta e la processi.
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy              ROT13: 
ybe...@cq.vasa.vg

 FF
Il tuo semplice problema ha dei risvolti interessanti e rivelano anche
alcune pecche storiche di Unix, a cui si sta ponendo rimedio in modo
non standard. Effettivamente non sarebbe prevista la notifica asincrona
delle modifica di un file, ma gia' linux supporta dnotify e tra poco
dovra' essere disponibile inotify per avere la notifica dell' accesso
a un file (inode). comunque se disponibile, tail -f dovra' essere
riscritto per usare questa caratteristica in luogo del polling.
quindi puoi usare tail -f che credo faccia automaticamente flush dello
standard output (in man tail non ho trovato, ma e' molto importante che
lo faccia). A questo punto puoi strivere un programmino che mutui da
tail -f la notifica asincrona (se a sua volta tail l' ha potuta mutuare
da sistema, altrimenti il suo polling) e per ogni linea attivi
un handler.
quanto chiedi puo' essere fatto in molti modi, esempio con uno script
Perl che apre il file di log come farebbe tail -f ed elebora ogni linea
di script, ma se non vuoi essere costretto al Perl e vuoi che un
semplice script di elaborazione venga portato in esecuzione a ogni
linea di input, dato che non sono al corrente di utility standard
che lo facciano, ti serve un sostware di interposizione:
tail -f /var/log/filedilog | perl -ne '$str = qx(./mioscript.sh $_); print
$str'
mioscript.sh riceve come argomendo in linea la linea appesa in filedilog
e viene istanziato a ogni linea (potrei dire "uno schifo", ma pratico).
e questa e' una soluzione.
----
Sempre tornando alla notifica asincrona:
se non disponibile inotify e quindi tail -f deve fare polling periodico,
puoi prendere in esame la possibilita' di far fare logging a hylafax
(se possibile, ma credo di si) su una named-pipe.
quindi /var/log/filedilog non dovra' essere un vero file, ma una named-pipe
creata con mknod p /var/log/filedilog , ma comunque il software di
interposizione, se vuoi controllare l' esecuzione di uno script per ogni
linea, ci dovra' essere lo stesso. certo che tale strato software potrebbe
incaricarsi di fare tutto e allora si risparmia al sistema l' avvio di un
nuovo processo per linea, ma la complessita' si trasverirebbe dallo
script shell a tal software.
Mi e' piaciuto rispondere in modo cosi' prolisso perche' il problemino
appartiene a una classe di problemi interessante.
ciao
Roberto.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 riscritto per usare questa caratteristica in luogo del polling.
tail -f va bene anche così, dato che non è previsto che giri per
quarant'otto ore consecutive (e anche in quel caso non è che si porti
dietro chissà che cosa: è uno stat() temporizzato e un
open()+read()+write().
se hai bisogno di qualcosa di più leggero puoi riscrivere tail --forever
usando inotify, ma non so se convenga comunque a meno di non avere
*molti* file da controllare.
ciao,
 Emmanuele.

 $str'
Questo è perfetto... ora mi sta dando una mano la persona che gestisce 
il server e ha detto che ci pensa lui a tenere il processo attivo.. non 
ho ben capito però che succede se il processo si interrompe... mi perdo 
delle statistiche...

 
Ci avevo pensato, ma non so bene come fare, visto che credo ci sia 
un'utility che spezza i file di log..
Per ora proviamo con la soluzione proposta da Roberto C poi vediamo che 
succede se cade il processo... perchè se perdo delle statistiche allora 
scrivo il progammino, ma a questo proposito avrei un'altra domanda:
Che facci un programmino che parte periodicamente e che elabora le 
statistiche fino a quel punto? perchè non ho bisogno delle statistiche 
in tempo reale in realtà..
E se accediamo contemporaneamente allo stesso file, io e hylafax? La 
macchina che usiamo, non spedisce un fax ogni tanto, ha 90 modem che 
spediscono in continuazione... non posso non prevedere la concorrenza..

  Emmanuele.
Ciao


 spediscono in continuazione... non posso non prevedere la concorrenza..
blocca il file con un exclusive lock fino a che non hai finito di
leggerlo; fcntl() è la funzione che cerchi.
ciao,
 Emmanuele.

 gia' dall' alba dei tempi UNIX/BSD/POSIX
evidentemente, quando POSIX è stato scritto il polling dei file era un
evento limitato e non particolarmente esteso nello spazio (numero di
file) o nel tempo (durata del monitoring). come ho scritto, tail
--forever non è stato pensato per girare 24/7 - e anche se viene usato
in questo modo, non è così pesante.  nei moderni sistemi, al contrario,
si monitorano varie decine di file, e il trend è destinato ad aumentare.
altri *nix (come solaris e sgi) hanno sistemi simili; se cerchi
un'astrazione, FAM (file alteration monitor) supporta vari sistemi di
polling (inotify, dnotify, stat() e RPC per filesystem remoti). l'API
di FAM è orrida, quindi di solito su usa qualcosa a più alto livello,
ad esempio gnome-vfs.
ciao,
 Emmanuele.

FF ha scritto:

Le statistiche sono comunque recuperabili dal logfile che continuerebbe
a essere presente (se non usi la soluzione della named-pipe! facciamo
cosi'! non la usare!) quindi le puoi recuperare con una elaborazione
successiva, non in tempo reale.
Attento a un aspetto che non avevo considerato, ma che hai introdotto
in un altro post. Il logrotate potrebbe fare solo rename dell' attuale
file e aprirne un altro. tail, come dice la manpage, apre il file
una volta sola e anche se cambia nome continua a seguire quello, quindi
la manpage suggerisce di usare --follow=nomefile che esequira'
periodicamente la open, posizionamento all' offset precedentemente
ricordato
e la read. Questo pero' implica l' accesso random al file e quindi
il deve essere un file autentico e non pipe.
Ciao


  Emmanuele.


 il deve essere un file autentico e non pipe.
Devo chiedere cosa hanno installato sulla macchina...
Grazie a tutti comunque dei consigli
FF

 successivamente.
questo è sicuro.
ciao,
 Emmanuele.

 Non ho lo Stewens sotto mano,
scusa l'ignoranza, ma ha cosa fai riferimento?
ciao
claudio

> alcune modifiche e le inserisce in una base dati).
Maurizio> invece di uno script scrivi un programmino; apri il log,
Maurizio> leggi una linea per volta e la processi.
UN PROGRAMMINO ????????
E tail lo avete dimenticato in /usr/bin ????????
:)
-- 
 /\           ___
/___/\_|_|\_|__|___Gian Uberto Lauri_____
  //--\| | \|  |   Integralista GNUslamico
\/                 e coltivatore diretto di Software