Почему inotify события стреляют несколько раз

Этот вопрос является результатом другого, что я позировал на 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].

13
задан 23 May 2017 в 15:39

2 ответа

У меня нет достаточного количества представителя для регистрации этого как комментария, но действительно ли Вы уверены, что временные, возможно-скрытые-файлы не создаются? У меня была подобная проблема с inotifywait увольнение многократно, но я понял, что это было, потому что энергия создаст .swp файл при редактировании, который запустил бы событие при закрытии. Это также взяло бы близкое событие из исходного файла.

Это кажется, что Вы замечаете событие, запускающее несколько файлов в тот же файл, хотя, который не является чем-то, которое я смог воспроизвести - это только произошло бы однажды для временного файла и однажды для оригинала.

я попробовал быстрый тест нано, и я не думаю, что он создает временный файл вообще (по крайней мере, для некоторых регистр символов), но является там чем-либо еще в Вашей установке, которая могла полагаться на подобное поведение?

0
ответ дан 24 May 2017 в 01:39
  • 1
    Тогда попытайтесь инвертировать скорость. В консоли тип synclient VertScrollDelta=-1 Это или 1 или-1. Или можно использовать больше число, если это становится слишком быстрым. – Barafu Albino 11 March 2017 в 06:22

Я не уверен, но по всей вероятности первый write_close пишет атрибуты файла в него, как время создания, и только после этого это пишет фактические данные. На самом деле rsync создает временный файл и когда все сделано, он перемещает временный файл в фактический файл в той же папке, таким образом, легко контролировать, обычно создавался в том, когда Вы используете rsync, и перемещение является атомарной операцией. С другой стороны, существует что-то улица один выстрел в inotify, вероятно, то использование, что мы можем инициировать что-то на первом, изменяет сообщение, и поскольку Вы предложили сон для разумного количества времени прежде, чем запустить операцию. Я рою это теперь и обновлю, когда я нахожу что-либо новым. https://superuser.com/questions/1133642/traceing-the-moment-when-file-is-completely-copied-to-samba-share-with-inotify

1
ответ дан 24 May 2017 в 01:39
  • 1
    Couldn' t находят synaptics свойства. Никакой synaptics драйвер не загружается? Мне установили жесты Libinput для некоторых легких макросов с 3 пальцами. Это - долгое время, так как я установил его и настроил его, таким образом, я can' t находят файл конфигурации или веб-сайт, я раньше создавал его. – vegarab 11 March 2017 в 06:25

Другие вопросы по тегам:

Похожие вопросы: