Этот вопрос является результатом другого, что я позировал на Stackoverflow. Я использую Наблюдателя - те же проблемы относятся к Incron - чтобы контролировать папку и ее дочерние папки для изменений и тихо запастись теми изменениями в Dropbox.
Я контролирую write_close
событие - IN_CLOSE_WRITE
- для цели. Первоначально я смотрел modify
событие, т.е. IN_MODIFY. В то время как это работало, я нашел, что при записи больших файлов это будет стрелять несколько раз. Та ярмарка, которой звучат, таким образом, я переключился на IN_CLOSE_WRITE
так как я чувствовал, что было довольно справедливо предположить, что для данного файла это только произойдет однажды.
Однако дело не в этом. Даже для очень небольшого текстового файла - всего одного символа - созданный в Нано событие имеет место два раза. В лучшем случае это может привести к ненужному трафику, когда тот же файл синхронизируется на Dropbox два раза. В моем собственном случае это приводит к аварии с тех пор на первом событии, я выполняю синхронизацию и затем удаляю серверный файл. Результат - на втором событии файл стороны Dropbox становится 0-байтовым файлом.
Я имею дело с этим на данный момент путем создания моего сна сценария синхронизации в течение многих 10-х, прежде чем я сделаю что угодно еще, и затем я проверяю, что рассматриваемый файл все еще существует до попытки синхронизации Dropbox. Это работает, потому что на втором повторении файл отсутствует, и сценарий только завершается.
Это звучит как hackish в лучшем случае Возможно, не плохой взлом, но я предпочел бы понимать - почему делает даже 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. Я запускаю демона Наблюдателя из сценария пакетной обработки, выполняемого через /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]
.
У меня нет достаточного количества представителя для регистрации этого как комментария, но действительно ли Вы уверены, что временные, возможно-скрытые-файлы не создаются? У меня была подобная проблема с inotifywait
увольнение многократно, но я понял, что это было, потому что энергия создаст .swp файл при редактировании, который запустил бы событие при закрытии. Это также взяло бы близкое событие из исходного файла.
Это кажется, что Вы замечаете событие, запускающее несколько файлов в тот же файл, хотя, который не является чем-то, которое я смог воспроизвести - это только произошло бы однажды для временного файла и однажды для оригинала.
я попробовал быстрый тест нано, и я не думаю, что он создает временный файл вообще (по крайней мере, для некоторых регистр символов), но является там чем-либо еще в Вашей установке, которая могла полагаться на подобное поведение?
Я не уверен, но по всей вероятности первый write_close пишет атрибуты файла в него, как время создания, и только после этого это пишет фактические данные. На самом деле rsync создает временный файл и когда все сделано, он перемещает временный файл в фактический файл в той же папке, таким образом, легко контролировать, обычно создавался в том, когда Вы используете rsync, и перемещение является атомарной операцией. С другой стороны, существует что-то улица один выстрел в inotify, вероятно, то использование, что мы можем инициировать что-то на первом, изменяет сообщение, и поскольку Вы предложили сон для разумного количества времени прежде, чем запустить операцию. Я рою это теперь и обновлю, когда я нахожу что-либо новым. https://superuser.com/questions/1133642/traceing-the-moment-when-file-is-completely-copied-to-samba-share-with-inotify
synclient VertScrollDelta=-1
Это или 1 или-1. Или можно использовать больше число, если это становится слишком быстрым. – Barafu Albino 11 March 2017 в 06:22