Какое событие 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 на манекене. Важным моментом является то, что манекен должен передаваться как последний файл в последовательности.
Я надеюсь, что это поможет.