To pytanie powstaje z innego pytania, które postawiłem na Stackoverflow . Używam Watcher - te same problemy dotyczą Incron - monitorować folder i jego foldery podrzędne dla zmian i cicho wiewiórki wyjazdowych tych zmian do Dropbox.
W tym celu monitoruję write_close
zdarzenie - IN_CLOSE_WRITE
- w tym celu. Początkowo oglądałem to modify
wydarzenie, tj. IN_MODIFY. Podczas gdy to zadziałało, odkryłem, że podczas pisania dużych plików uruchomi się więcej niż raz. Brzmiało to uczciwie, więc przestawiłem się, IN_CLOSE_WRITE
ponieważ uznałem, że uzasadnione jest założenie, że dla danego pliku wystąpi to tylko raz.
Tak jednak nie jest. Nawet w przypadku bardzo małego pliku tekstowego - tylko jednego znaku - utworzonego w Nano zdarzenie występuje dwa razy. W najlepszym wypadku może to powodować niepotrzebny ruch, gdy ten sam plik zostanie zsynchronizowany dwukrotnie z Dropbox. W moim przypadku prowadzi to do katastrofy, ponieważ przy pierwszym zdarzeniu przeprowadzam synchronizację, a następnie usuwam plik po stronie serwera. Rezultat - przy drugim zdarzeniu plik boczny Dropbox staje się plikiem 0-bajtowym.
Zajmuję się tym na razie, zmuszając mój skrypt synchronizacji do uśpienia na 10 sekund, zanim zrobię cokolwiek innego, a następnie sprawdzam, czy dany plik nadal istnieje przed podjęciem próby synchronizacji Dropbox. Działa to, ponieważ podczas drugiej iteracji brakuje pliku, a skrypt właśnie się kończy.
To w najlepszym razie brzmi hackersko. Być może niezły hack, ale wolałbym zrozumieć - dlaczego nawet IN_CLOSE_WRITE
zdarzenie zdarza się więcej niż jeden raz?
Niektóre dodatkowe informacje
- Sprawdź, czy nie ma wielu uruchomionych obserwatorów.
Wyjście z 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
System plików to ext4
. Powinienem wspomnieć, że napotkałem dokładnie ten sam problem z Incron. Uruchamiam demona Watchera ze skryptu wsadowego wykonanego za pośrednictwem /etc/rc2.d
. Incron OTH uruchamia się bez bałaganu przeze mnie poprzez domyślną apt-get install incron
instalację.
Esencję mojego watcher.ini
pliku pokazano poniżej.
[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
Skróciłem datastore.php
skrypt do niezbędnego minimum, aby sprawdzić, czy został uruchomiony dwa razy bez żadnego bałaganu podczas przesyłania Dropbox + kodu źródłowego.
#! /usr/bin/php
<?php
file_put_contents('/tmp/watcher',$argv[1],FILE_APPEND);
?>
Następnie utworzyłem mały plik przy danej ścieżce, a następnie zbadałem /tmp/watcher
. Problem nadal występuje - plik nadal zawiera dwa kolejne wpisy $argv[1]
.
ext4
i jestem całkiem pewien, że nie mam uruchomionych dwóch instancji Watchera. Mam ten sam problem z Incron.
delete
rutynę i spróbować ponownie?
unlink
problem nie występuje