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_closeevento - IN_CLOSE_WRITE- allo scopo. Inizialmente stavo guardando l' modifyevento, 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_WRITEdal 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_WRITEevento 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 incroninstallazione predefinita .
L'essenza del mio watcher.inifile è 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.phpscript 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].
ext4e sono ragionevolmente sicuro di non avere due istanze di Watcher in esecuzione. Ho riscontrato lo stesso problema con Incron.
deleteroutine e riprovare?
unlinkil problema persiste