Це запитання виникає з іншого, яке я поставив перед Stackoverflow . Я використовую Watcher - ті ж самі проблеми стосуються і Incron - для контролю за папкою та її дочірніми папками щодо змін та мовчки перебирати ці зміни в Dropbox.
Я стежу за write_close
подією - IN_CLOSE_WRITE
- з метою. Спочатку я спостерігав за modify
подією, тобто IN_MODIFY. Хоча це працювало, я виявив, що при написанні великих файлів він буде спрацьовувати не один раз. Це звучало справедливо, тому я перейшов, IN_CLOSE_WRITE
оскільки відчув, що справедливо вважати, що для даного файлу це відбудеться лише один раз.
Однак це не так. Навіть для дуже невеликого текстового файлу - всього одного символу - створеного в Nano, подія відбувається два рази. У кращому випадку це може призвести до зайвого трафіку, коли один і той же файл синхронізується на Dropbox два рази. У моєму випадку це призводить до катастрофи, оскільки в перший захід я здійснюю синхронізацію, а потім видаляю файл на стороні сервера. Результат - у другій події файл сторони Dropbox стає 0-байтним файлом.
Я зараз маю справу з цим, змушуючи сценарій синхронізації спати протягом 10 секунд, перш ніж робити щось інше, а потім перевіряю, чи існує відповідний файл до спроби синхронізації Dropbox. Це працює, тому що при другій ітерації файл відсутній, а сценарій просто припиняється.
Це в кращому випадку звучить хакі. Можливо, це не поганий злом, але я хотів би зрозуміти - чому ж навіть IN_CLOSE_WRITE
подія трапляється не один раз?
Деякі додаткові відомості
- Перевірте, чи не існує декількох примірників запуску вахти.
Вихід від 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
Файлова система є ext4
. Я мушу зазначити, що я стикався з точно тим же питанням з Incron. Я запускаю демон Watcher з пакетного сценарію, виконаного через /etc/rc2.d
. Incron OTH запускається без будь-якого мороку через його apt-get install incron
встановлення за замовчуванням .
Суть мого watcher.ini
файлу наведена нижче.
[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
Я зменшив datastore.php
сценарій до найголовнішого, щоб переконатися, що він запускається двічі без будь-якого з моїх брудних завантажень Dropbox + вихідний код видалення.
#! /usr/bin/php
<?php
file_put_contents('/tmp/watcher',$argv[1],FILE_APPEND);
?>
Потім я створив невеликий файл на шляху, про який йде мова, а потім вивчив /tmp/watcher
. Проблема все ще зберігається - у файлі все ще є дві послідовні записи для $argv[1]
.
ext4
і я впевнений, що у мене немає двох екземплярів роботи Watcher. Я зіткнувся з тим же питанням з Incron.
delete
рутину та спробувати ще раз?
unlink
проблема не зберігається