Этот вопрос возникает из другого, который я поставил на 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
проблема не