Подтвердить что ты не робот

LINUX: как определить, что загрузка файла ftp завершена

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

4b9b3361

Ответ 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 хочет создать субдиректор и загрузить там), вам нужно будет справиться с этим самостоятельно.

Ответ 5

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

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