В моем проекте у меня есть функция загрузки файлов. Файлы загружаются через FTP. Мне нужно настроить прослушиватель, который будет проверять наличие новых файлов и вызывать script только при завершении загрузки файлов. Потому что, если я запустил этот script сразу после обнаружения нового файла, он может начать обрабатывать файл, который не полностью загружен, что приведет к ошибке. Может ли кто-нибудь сказать, возможно ли это на LINUX и как я могу это сделать?
LINUX: как определить, что загрузка файла ftp завершена
Ответ 1
Я бы попытался использовать inotify, код события IN_CLOSE_WRITE.
Ответ 2
Apache "Mina" ftp server (java) может выполнить то, что вы хотите, включая обнаружение неудачной загрузки, как упомянуто здесь
Цитата:
Из Ftplet.afterCommand вы должны быть в состоянии посмотреть на ответ. Для эти неудачные передачи, которые FtpServer может обнаружить (что вызывает SocketException или IOException) должно быть что-то вроде 426 или 551.
Обзор Ftplet здесь, включая коды ответов.
Подпись метода afterCommand:
FtpletResult afterCommand(FtpSession session, FtpRequest request, FtpReply reply)
Вы проверили бы reply.getCode()
в своем методе переопределения. Вы должны подклассифицировать DefaultFtplet
, а не реализовывать интерфейс Ftplet
с нуля.
Обратите внимание, что DefaultFtplet::afterCommand
показывает, как определить, на какую клиентскую команду реагирует. Вы можете проверить STOR
или STOU
и ответ-код 426
или 551
, чтобы обнаружить неудачные загрузки.
Однако это может не обнаружить загрузку, намеренно завершенную клиентом, если клиентское приложение решает обработать передачу, как будто файл был короче, чем он есть. В случае непреднамеренно нарушенного соединения, я думаю, что проверка кода ответа будет работать. Тест может состоять в том, чтобы убить клиентское приложение или снизить сетевой интерфейс клиентской машины.
Чтобы обрабатывать успешные загрузки (ваш исходный вопрос), вы можете искать вместо этого ответный код успеха, т.е. 226
.
Ответ 3
Посмотрите inotify
Он не автоматически смотрит вспомогательные каталоги, поэтому, если вам нужно отслеживать многие учетные записи ftp (или клиент FTP хочет создать субдиректор и загрузить там), вам нужно будет справиться с этим самостоятельно.
Ответ 4
Я искал то же самое и наткнулся на pureftpd, у которого есть функция загрузки script. Похоже, именно то, что нужно. Найденные здесь детали: http://www.linuxbyexamples.net/2012/10/config-ftp-server-trigger-upload-file-to-call-external-script.html
Ответ 5
Я использовал функцию HiddenStores Proftpd. Он скрывает файлы в пути, префикс их с .in.filename.ext, пока они не закончат загрузку. Затем ваш процесс может безопасно перечислить каталоги для завершенных файлов.
http://www.proftpd.org/docs/directives/linked/config_ref_HiddenStores.html