Bu soru, Stackoverflow üzerinde sormuş olduğum başka bir sorudan kaynaklanıyor . Ben kullanıyorum Watcher - Aynı konular için geçerli Incron - Bir klasörü ve uzak değişiklikler ve sessizce sincap Dropbox'a bu değişiklikler için çocuk klasörleri izlemek için.
Ben izlemek write_close
olay - IN_CLOSE_WRITE
- amaç için. Başlangıçta modify
olayı izliyordum , yani IN_MODIFY. Bu çalışırken, büyük dosyalar yazarken birden fazla kez ateş olacağını buldum. Bu kulağa adil geldi, IN_CLOSE_WRITE
bu yüzden belirli bir dosya için sadece bir kez olacağını varsaymanın makul olduğunu düşündüğümden beri geçtim.
Ancak durum böyle değil. Nano'da oluşturulan çok küçük bir metin dosyası için (yalnızca bir karakter) bile olay iki kez gerçekleşir. En iyi ihtimalle, aynı dosya Dropbox'ta iki kez senkronize edildiğinde gereksiz trafik ortaya çıkabilir. İlk olayda senkronizasyonu gerçekleştirdiğimden sonra sunucu tarafı dosyasını sildiğim için kendi durumumda felakete yol açıyor. Sonuç - ikinci olayda Dropbox yan dosyası 0 bayt dosyası olur.
Ben başka bir şey yapmadan önce benim senkronizasyon komut dosyası 10 saniye uyku yaparak bu konuda ilgileniyorum ve daha sonra söz konusu dosyanın hala Dropbox senkronizasyon denemeden önce var olup olmadığını kontrol edin. Bu, ikinci yinelemede dosya eksik olduğu ve komut dosyasının sonlandığı için çalışır.
Bu en iyi ihtimalle kulağa hoş geliyor. Belki de kötü bir hack değil ama anlamayı tercih ederim - neden IN_CLOSE_WRITE
olay bile birden fazla kez gerçekleşiyor?
Bazı ek bilgiler
- Çalışan birden fazla izleyici örneği olmadığından emin olun.
Çıktı 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
Dosya sistemi ext4
. Incron ile tam olarak aynı sorunla karşılaştığımı belirtmeliyim. Watcher arka plan programını, üzerinden yürütülen bir toplu komut dosyasından başlatırım /etc/rc2.d
. Incron OTH, varsayılan apt-get install incron
kurulumu aracılığıyla benim tarafımdan herhangi bir karışıklık yaşamadan başlar .
Dosyamın özü watcher.ini
aşağıda gösterilmiştir.
[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
Ben datastore.php
herhangi bir dağınık Dropbox yükleme + kaynak silme kodu olmadan iki kez ateşlendiğini doğrulamak için betiği çıplak temellere indirgedim .
#! /usr/bin/php
<?php
file_put_contents('/tmp/watcher',$argv[1],FILE_APPEND);
?>
Daha sonra söz konusu yolda küçük bir dosya oluşturdum ve sonra inceledim /tmp/watcher
. Sorun hala devam ediyor - dosyanın hala iki ardışık girişi var $argv[1]
.
ext4
ve ben çalışan iki Watcher örneği olmadığından eminim. Incron ile aynı sorunu yaşadım.
delete
bırakıp tekrar deneyebilir misiniz?
unlink
ve sorun