LINUX: как определить, что загрузка ftp-файла завершена - PullRequest
17 голосов
/ 18 июня 2010

В моем проекте есть функция загрузки файлов. Файлы загружаются через FTP. Мне нужно настроить прослушиватель, который будет проверять наличие новых файлов и запускать сценарий только после завершения загрузки файла. Потому что, если я запускаю этот скрипт сразу после обнаружения нового файла, он может начать обрабатывать файл, который не был полностью загружен, что приведет к ошибке. Кто-нибудь может сказать, возможно ли это в LINUX и как я могу это сделать?

Ответы [ 5 ]

12 голосов
/ 18 июня 2010

Я бы попробовал использовать inotify , код события IN_CLOSE_WRITE.

6 голосов
/ 28 мая 2011

FTP-сервер Apache "Mina" (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 голосов
/ 18 июня 2010

Посмотрите на inotify

Хотя он не просматривает автоматически подкаталоги, поэтому, если вам нужно отслеживать много учетных записей ftp (или клиент FTP хочет создать подкаталог)и загрузите туда) Вам нужно будет справиться с этим самостоятельно.

1 голос
/ 28 марта 2013

Я искал то же самое и наткнулся на pureftpd, который имеет функцию сценария загрузки.Похоже, именно то, что было нужно.Подробности нашел здесь: http://www.linuxbyexamples.net/2012/10/config-ftp-server-trigger-upload-file-to-call-external-script.html

0 голосов
/ 26 января 2015

Я использовал функцию HiddenStores в Proftpd.Он скрывает транзитные файлы, добавляя к ним префикс .in.filename.ext до тех пор, пока они не завершат загрузку.Ваш процесс может затем безопасно перечислить каталоги для завершенных файлов.

http://www.proftpd.org/docs/directives/linked/config_ref_HiddenStores.html

...