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ępujeOdpowiedzi:
Nie jestem pewien, ale najprawdopodobniej pierwszy write_close zapisuje w nim atrybuty pliku, takie jak czas utworzenia, a dopiero potem zapisuje rzeczywiste dane. W rzeczywistości rsync tworzy plik tymczasowy, a gdy wszystko jest zrobione, przenosi plik tymczasowy do rzeczywistego pliku w tym samym folderze, dzięki czemu można łatwo monitorować, że normalnie utworzono go podczas korzystania z programu rsync, a ruch jest operacją atomową. Z drugiej strony jest coś calle jeden strzał w inotify, prawdopodobnie za pomocą tego możemy wyzwolić coś przy pierwszej wiadomości modyfikującej i jak zasugerowałeś sen przez rozsądny czas przed rozpoczęciem operacji. Kopię to teraz i zaktualizuję, gdy znajdę coś nowego. /superuser/1133642/traceing-the-moment-when-file-is-completely-copied-to-samba-share-with-inotify
źródło
Nie mam wystarczającej liczby przedstawicieli, aby opublikować to jako komentarz, ale czy jesteś pewien, że tymczasowe, prawdopodobnie ukryte pliki nie są tworzone? Miałem podobny problem z
inotifywait
wielokrotnym odpalaniem, ale zdałem sobie sprawę, że było tak, ponieważ vim utworzyłby plik .swp podczas edycji, co wywołałoby zdarzenie podczas zamykania. Odbierze również zdarzenie zamknięcia z oryginalnego pliku.Wygląda na to, że zauważysz zdarzenie uruchamiające wiele plików w tym samym pliku, czego nie byłem w stanie odtworzyć - zdarzy się to tylko raz dla pliku tymczasowego i raz dla oryginału.
Próbowałem szybkiego testu z nano i nie wydaje mi się, aby w ogóle tworzył plik tymczasowy (przynajmniej w przypadku kilku znaków), ale czy jest jeszcze coś w twojej konfiguracji, co mogłoby polegać na podobnym zachowaniu?
źródło