Questa domanda sorge da un'altra che avevo posto su Stackoverflow . Sto usando Watcher - gli stessi problemi si applicano a Incron - per monitorare una cartella e le sue cartelle secondarie alla ricerca di modifiche e silenziare silenziosamente quelle modifiche a Dropbox.
Controllo l' write_close
evento - IN_CLOSE_WRITE
- allo scopo. Inizialmente stavo guardando l' modify
evento, cioè IN_MODIFY. Mentre questo ha funzionato, ho scoperto che quando si scrivevano file di grandi dimensioni si attiva più di una volta. Sembrava giusto, quindi sono passato IN_CLOSE_WRITE
dal momento che ho ritenuto che fosse ragionevolmente ragionevole supporre che per un dato file sarebbe successo solo una volta.
Tuttavia, non è così. Anche per un file di testo molto piccolo - solo un carattere - creato in Nano, l'evento si verifica due volte. Nella migliore delle ipotesi, ciò può comportare un traffico non necessario quando lo stesso file viene sincronizzato su Dropbox due volte. Nel mio caso porta al disastro poiché al primo evento eseguo la sincronizzazione e quindi elimino il file sul lato server. Il risultato: al secondo evento il file laterale Dropbox diventa un file a 0 byte.
Ho a che fare con questo per ora facendo dormire lo script di sincronizzazione per 10 secondi prima di fare qualsiasi altra cosa e quindi controllo che il file in questione esista ancora prima di tentare la sincronizzazione di Dropbox. Questo funziona perché nella seconda iterazione manca il file e lo script termina.
Questo suona al massimo hacker. Forse non è un brutto trucco, ma preferirei capire - solo perché l' IN_CLOSE_WRITE
evento si verifica più di una volta?
Alcune informazioni aggiuntive
- Verifica che non vi siano più istanze di watcher in esecuzione.
Uscita da ps ax|grep watcher.py
23880 ? Sl 0:01 python /usr/local/bin/watcher.py restart
24977 pts/0 S+ 0:00 grep --color=auto watcher.py
Il file system è ext4
. Devo dire che ho riscontrato esattamente lo stesso problema con Incron. Avvio il demone Watcher da uno script batch eseguito tramite /etc/rc2.d
. Incron OTH si avvia senza alcun problema da parte mia tramite la sua apt-get install incron
installazione predefinita .
L'essenza del mio watcher.ini
file è mostrata di seguito.
[DEFAULT]
logfile=/var/log/watcher.log
pidfile=/var/run/watcher.pid
[job1]
watch=/path/to/watch
events=write_close
excluded=
recursive=true
autoadd=true
command=/home/datastore.php $filename
Ho ridotto lo datastore.php
script agli elementi essenziali per verificare che sia stato attivato due volte senza nessuno dei miei disordinati upload Dropbox + codice di eliminazione del codice sorgente.
#! /usr/bin/php
<?php
file_put_contents('/tmp/watcher',$argv[1],FILE_APPEND);
?>
Ho quindi creato un piccolo file nel percorso in questione e poi esaminato /tmp/watcher
. Il problema persiste ancora: il file ha ancora due voci successive per $argv[1]
.
ext4
e sono ragionevolmente sicuro di non avere due istanze di Watcher in esecuzione. Ho riscontrato lo stesso problema con Incron.
delete
routine e riprovare?
unlink
il problema persiste