Назад | Перейти на главную страницу

Входящая передача по FTP не отображается в lsof при использовании определенного FTP-клиента

У меня есть сценарий, который постоянно отслеживает каталог Dropbox FTP и обрабатывает новые файлы, когда они поступают. Сценарий запускается lsof для каждого файла, прежде чем он попытается обработать его, чтобы определить, передается ли файл по-прежнему (некоторые файлы имеют большой размер, и передача требует времени), чтобы избежать обработки неполного файла.

Все работает нормально, за исключением одного конкретного FTP-клиента. По какой-то причине, когда этот клиент загружает файл на FTP-сервер, запускается lsof по файлу ничего не возвращает. Я проверил это, запустив watch -n0.1 'lsof /path/to/file.txt' а затем загрузите файл file.txt на сервер с помощью двух разных FTP-клиентов. При загрузке с помощью Cyberduck lsof возвращает данные об открытом файле, при использовании другого FTP-клиента lsof ничего не возвращает. Я не понимаю, как это могло быть (и FWIW, я получаю те же результаты с fuser команда). Я тоже бегу watch -n0.1 'ls -l /path/to/file' и могу видеть, как размер файла меняется по мере передачи клиентов, поэтому я знаю клиентов являются запись в файл.

Я знаю, что есть обходные пути для решения моей проблемы, но меня больше интересует, как именно этот FTP-клиент может записывать в файл без того, чтобы этот файл был «открытым» с точки зрения системы. А идеи?

Я запускаю vsftp на Ubuntu Server 12.04 LTS

Обновить:

Оказалось, что когда я ранее тестировал это с помощью Cyberduck, я подключался к FTP-серверу с помощью SFTP, а не FTP. Когда я загружаю файл с помощью Cyberduck по FTP, я сталкиваюсь с той же проблемой - файл загружается, но в нем ничего не отображается. lsof. Я также использовал стандартный FTP-клиент в Debian для загрузки файла с помощью PUT и APPEND - опять же, то же самое.

Похоже, что все загрузки по FTP (независимо от клиента) записываются в соответствующий файл без «открытия» файла, насколько это касается системы. Я протестировал этот сценарий на другом FTP-сервере, и все работает, как ожидалось - когда файлы загружаются, они отображаются как открытые в lsof. Итак, что-то не так с конкретной конфигурацией моего FTP-сервера. Я подозреваю, что это как-то связано с версией lsof и / или vsftpd. Это более старые версии 4.81 и 2.3.2 соответственно.

В дополнение к STOR (PUT), который большинство из нас знает и будет использовать, относительно необычная команда FTP для загрузки данных на удаленный сервер - это ДОБАВИТЬ :

     APPEND (with create) (APPE)

        This command causes the server-DTP to accept the data
        transferred via the data connection and to store the data in
        a file at the server site.  If the file specified in the
        pathname exists at the server site, then the data shall be
        appended to that file; otherwise the file specified in the
        pathname shall be created at the server site.

Это может позволить клиенту добавлять файлы в файл, не открывая его все время ...