какое событие inotify сигнализирует о завершении операции с большим файлом?

для больших файлов или медленных соединений копирование файлов может занять некоторое время.

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

когда передача файла завершена и завершена, какое событие inotify запускается?


person Jeremiah Rose    schedule 24.05.2010    source источник


Ответы (3)


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

IN_CLOSE ловит и IN_CLOSE_WRITE, и IN_CLOSE_NOWRITE, поэтому принимайте собственные решения о том, хотите ли вы поймать только один из них. (Возможно, вы хотите, чтобы они оба - WRITE/NOWRITE связаны с правами доступа к файлам, а не с тем, были ли фактически сделаны какие-либо записи).

Дополнительную документацию (хотя и раздражает, но не эту часть информации) можно найти в Документация/файловые системы/inotify.txt.

person Nick Bastin    schedule 24.05.2010
comment
мой вопрос касается именно копирования файлов в nautilus. в этом случае IN_CLOSE_WRITE достаточно. IN_CLOSE сам по себе не существует в pyinotify. - person Jeremiah Rose; 24.05.2010

В моем случае я хотел выполнить скрипт после полной загрузки файла. Я использовал WinSCP, который записывает большие файлы с расширением .filepart до завершения.

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

Но затем я заметил, что в конце загрузки, когда все части были завершены, у меня срабатывает уведомление IN_MOVED_IN, которое помогло мне запустить мой скрипт именно тогда, когда я этого хотел.

Если вы хотите знать, как ведет себя ваш загрузчик файлов, добавьте это в incrontab:

/your/directory/ IN_ALL_EVENTS echo "$$ $@ $# $% $&"

а потом

tail -F /var/log/cron

и отслеживайте все запускаемые события, чтобы выяснить, какое из них подходит вам лучше всего.

Удачи!

person Reza S    schedule 13.05.2014

Почему бы вам не добавить фиктивный файл в конце передачи? Вы можете использовать код события IN_CLOSE или IN_CREATE на макете. Важно то, что фиктивный файл должен быть передан как последний файл в последовательности.

Надеюсь, это поможет.

person user_1177868    schedule 28.02.2014