Newsgroup: it.comp.os.linux.iniziare
Titolo: inotifywait

Ho uno script con inotifywait e avrei bisogno di avere il nome del file
che ha attivato l'evento e che ha comportato l'uscita da inotifywait.
 
inotifywait --fromfile /tmp/lista.txt --event modify
 
in pratica lista.txt contiene una lista di files e volevo sapere quale
di questi files � stato modificato. Ho letto il man e cercato su
internet ma non ho capito come fare, pare che debba dare come output il
file che ha determinato l'evento ma a me da solo:
 
Setting up watches.
Watches established.
 
e poi esce quando l'evento occorre. Che cosa non capisco? Grazie.
-- 
Sandro kensan 
www.kensan.it
 & 
www.qiqi.it
 geek site


 
Non ho mai usato quel comando per monitorare i files
Poichè avevo questa esigenza ho fatto tempo fa un programmino perl per 
la gestione che naturalmente usa la system call inotify
Se conosci perl e sei interessato te lo posso passare e poi lo modifichi 
come piace a te
 
 
 

 
non e' che va specificato il parametro:
 
-m, --monitor
Instead of exiting after receiving a single event, execute indefinitely. The default behaviour is to exit after the first event occurs
 
e poi indirizzare lo stdout e lo stderr con i parametri: -o e -s

 come piace a te
 
Grazie per l'offerta ma non conosco il perl. Trovo a adatto a queste
cose la bash altrimenti avrei fatto il programmino in php che conosco
meglio.


 Output events to <file> rather than stdout
 
Prover� ma il manuale mi sembra chiaro, si tratta di una alternativa a
stdout.



 
Ok, se conosci php prendere confidenza con perl non è difficile (php è 
una semplificazione di perl)
Comunque come vuoi
 

 Comunque come vuoi
 
non lo sapevo. Comunque ho visto che pure in php c'è inotify e potrei
scrivere il mio script in php ma penso che il linguaggio giusto per
quello che sto facendo sia bash e pur essendo molto incompetente con
questo linguaggio sto imparando e ho fatto lo script.
 
Mi rimane il problema di inotify che non funziona come immaginavo.
Chiederò su qualche forum internazionale e poi vedrò come ultima
spiaggia se è possibile metterci un printf all'interno del codice sorgente.



prova a guardare il comando inotifywatch se fa al caso tuo
 
 

 prova a guardare il comando inotifywatch se fa al caso tuo
 
inotifywait è perfetto per il mio caso, l'unica cosa che mi manca è
l'informazione su quale file si è verificato l'evento che ha determinato
l'uscita da inotifywait.


 
 
Quindi non e` perfetto...
 
Credo che "enoquick" abbia ragione, per quello
che vuoi tu "watch" e` piu` corretto.
 
bye,
 
-- 
 
piergiorgio

 che vuoi tu "watch" e` piu` corretto.
 
Ho provato inotifywatch e mi fa vedere il file modificato ma non esce!
per farlo uscire devo premere control-c. Mi serve qualche cosa che esca
subito appena avviene l'evento in modo da poterlo gestire dal resto del
codice.



 
Il man dice questo:
 
inotifywatch will output a table on standard out with one column for 
each type of event and one row for each watched file
        or  directory.   The  table will show the amount of times each 
event occurred for each watched file or directory.  Output
        can be sorted by a particular event using the -a or -d options.
 
 
Naturalmente non ho provato, mi sono attenuto al manuale
 

 Naturalmente non ho provato, mi sono attenuto al manuale
 
Io ho provato e inotifywatch funziona senza mai uscire oppure esce dopo
un tempo pari a t secondi.
 
Se devo fare qualche cosa tipo:
 
while : do
  file = $(inotifywait --fromfile /tmp/lista.txt --event modify)
  cp -f "$file" $HOME/cloud
done
 
come faccio a farlo con il watch in tempo reale?



Non è sbagliato il comportamento
O vuoi salvare un file o vuoi elaborare le informazioni (o tutti e due)
Se vuoi salvare il file occorre fermare inotify
Se vuoi elaborarlo in real time non serve mettere su file, basta una pipe
 
 
 
 


Dimenticavo, l' opzione m attiva la modalità monitor quindi con
 
inotifywait --fromfile /tmp/lista.txt --event modify -m > file
 
continua a scrivere su file fino alla terminazione (con kill o ctrl-c)
 
Questo è per il watch in tempo reale
 
 

 Se vuoi elaborarlo in real time non serve mettere su file, basta una pipe
 
Questo mi suonava bene e sono andato a veder e ho trovato alcuni
problemi che però mi hanno illuminato, quindi grazie per il suggerimento
e la pazienza :)
 
Se posso approfittarne mi sapresti dire come mai con kwrite non riesco a
gestire le modifiche a un file? Seguendo il tuo suggerimento penso di
mettere in pipe il comando:
 
$ inotifywait -m --timefmt '%H:%M:%S' --format '%T %w %e %f'
sync_lista.txt prova.txt
 
mi sono perso nel funzionamento che non capisco di kwrite con cui
modifico i file. Pare che non modifichi i files, dopo un save compare il
messaggio "DELETE_SELF" e poi più nulla nelle successive modifiche del
file tramite kwrite.
 
Setting up watches.
Watches established.
12:33:18 sync_lista.txt OPEN
12:33:18 sync_lista.txt ACCESS
12:33:18 sync_lista.txt CLOSE_NOWRITE,CLOSE
12:33:18 sync_lista.txt OPEN
12:33:18 sync_lista.txt ACCESS
12:33:18 sync_lista.txt CLOSE_NOWRITE,CLOSE
12:33:18 sync_lista.txt OPEN
12:33:18 sync_lista.txt ACCESS
12:33:18 sync_lista.txt CLOSE_NOWRITE,CLOSE
12:33:37 sync_lista.txt ATTRIB
12:33:37 sync_lista.txt DELETE_SELF
12:36:15 prova.txt OPEN
12:36:15 prova.txt ACCESS
12:36:15 prova.txt CLOSE_NOWRITE,CLOSE
12:36:15 prova.txt OPEN
12:36:15 prova.txt ACCESS
12:36:15 prova.txt CLOSE_NOWRITE,CLOSE
12:36:15 prova.txt OPEN
12:36:15 prova.txt ACCESS
12:36:15 prova.txt CLOSE_NOWRITE,CLOSE
12:36:25 prova.txt ATTRIB
12:36:25 prova.txt DELETE_SELF
 
Avevo letto che gli editor hanno un comportamento strano da questo punto
di vista e che non sono sensibili all'opzione di inotify --event modify.
Avevo trovato un esempio in Rete in cui suggerivano un workaround,
indagherò meglio.
 
Grazie intanto, mi pare che questo risolva il mio problema e mi apra
altri problemi da risolvere :)


 altri problemi da risolvere :)
 
Però facendo mente locale il comando semplice:
 
inotifywait prova.txt --event modify
 
funzionava perfettamente e usciva esattamente quando premevo save su
kwrite, quindi il monitorare (--monitor) funziona in modo diverso e meno
bene.



 
 
 
Ho una fatto una prova con kwrite
In modalità monitor senza filtri sugli eventi fa questo quando salvo il 
file da kwrite
 
 
/home/enoquick/fil1.txt OPEN
/home/enoquick/fil1.txt ACCESS
/home/enoquick/fil1.txt CLOSE_NOWRITE,CLOSE
/home/enoquick/fil1.txt MODIFY
/home/enoquick/fil1.txt OPEN
/home/enoquick/fil1.txt MODIFY
/home/enoquick/fil1.txt CLOSE_WRITE,CLOSE
/home/enoquick/fil1.txt OPEN
/home/enoquick/fil1.txt CLOSE_NOWRITE,CLOSE
/home/enoquick/fil1.txt OPEN
/home/enoquick/fil1.txt ACCESS
/home/enoquick/fil1.txt CLOSE_NOWRITE,CLOSE
 
 
Mi sembra tutto OK
 
 
 
 

 
 
Se hai un pipe che legge da "watch", puoi
fare tutto quello che vuoi, incluso uscire
quando hai raggiunto lo scopo.
 
Tipo:
 
inotifywatch | while read filename
do
  do something
  exit for real (questo va verificato)
done
 
Ovviamente, puo` essere che il "while"
loop sia completamente inutile e si
possa fare in maniera piu` semplice.
 
Oppure hai requisiti che non ho capito...
 
bye,
 
-- 
 
piergiorgio

 Mi sembra tutto OK
 
A me funziona diversamente:
 
20:31:43 prova.txt OPEN
20:31:43 prova.txt ACCESS
20:31:43 prova.txt CLOSE_NOWRITE,CLOSE
20:31:43 prova.txt OPEN
20:31:43 prova.txt ACCESS
20:31:43 prova.txt CLOSE_NOWRITE,CLOSE
20:31:43 prova.txt OPEN
20:31:43 prova.txt ACCESS
20:31:43 prova.txt CLOSE_NOWRITE,CLOSE
20:31:47 prova.txt ATTRIB
20:31:47 prova.txt DELETE_SELF


 possa fare in maniera piu` semplice.
 
La cosa non funziona bene anzi funziona malissimo:
 
inotifywait prova.txt --timefmt '%H:%M:%S' --format '%T %w %e' --event
DELETE_SELF --monitor|while read file; do echo $file; exit; done
 
Quando salvo con un editor il file prova.txt mi compare:
 
21:24:40 prova.txt DELETE_SELF
 
ma non esce. Invece credo che in tal caso, cioè quando prova.txt viene
cancellata, inotifywait muoia e qualche cosa va storto.
 
Ovviamente un:
 
inotifywait prova.txt --timefmt '%H:%M:%S' --format '%T %w %e' --event
OPEN --monitor|while read file; do echo $file; exit; done
 
funziona benissimo.
Un semplice:
 
inotifywait prova.txt --timefmt '%H:%M:%S' --format '%T %w %e' --monitor
 
dovrebbe uscire dopo avere salvato con kwrite/gedit in quanto si
verifica l'evento DELETE_SELF e quindi inotifywait muore ma qualche cosa
va storto e non esce.



"WATCH" non "WAIT", "inotifywatch".
 
bye,
 
-- 
 
piergiorgio


Mi rispondo da solo ma sono arrivato alla soluzione grazie a Sartor e
enoquick ma soprattutto a questo messaggio sui forum:
 
http://stackoverflow.com/questions/2754954/inotify-delete-self-when-modifying-and-saving-a-file
 
 
Il problema � che gli editor non modificano i file ma li cancellano
(moove, mv), quindi � il caso di usare l'evento DELETE_SELF e non
MODIFY. Un editor come nano e vi, invece, modificano i file e quindi �
bene metterli entrambi. Altro problema � che quando il file viene
cancellato da kwrite, gedit, kate, vim comporta il fatto che inotifywait
esce o meglio muore. Questo comporta che il monitorare (--monitor) un
file che � cancellato blocca inotify. Invece con inotify semplice pare
non ci siano problemi.
 
La soluzione � quella di mettere in un ciclo while inotifywait che
intercetter� gli eventi di cancellazione per gli editor visuali e le
modifiche per nano e altri editor semplici:
 
while true; do file=$( inotifywait -q --fromfile /tmp/lista.txt --format
'%w' --event DELETE_SELF,MODIFY ); cp -f "$file" "Cloud"/; done
 
In pi� si ha la possibilit� di monitorare anche la lista
(/tmp/lista.txt) e di tenerla aggiornata in real time, basta mettere il
*nome* del file /tmp/lista.txt dentro il file /tmp/lista.txt
 
Ovviamente controllare l'evento DELETE_SELF non � il massimo in quanto
se venisse cancellato il file effettivamente e non solo mosso (mv) il
successivo cp darebbe errore e quindi si richiede di gestire il caso.
 
Grazie a tutti.



 
 
Perfetto, ciao
 
 

 [ -e file ] && cp ...
 
Copio e incollo il suggerimento :)
