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

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

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

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

3 ответа

Решение

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

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

Есть больше документации (хотя, к сожалению, не этой части информации) в http://www.mjmwired.net/kernel/Documentation/filesystems/inotify.txt.

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

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

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

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

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

а потом

tail -F /var/log/cron

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

Удачи!

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

Я надеюсь, что это поможет.

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