Входящая передача по 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 соответственно.
1 ответ
В дополнение к STOR (PUT), который большинство из нас знает и будет использовать, для загрузки данных на удаленный сервер используется относительно необычная команда FTP: APPEND:
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.
Может позволить клиенту добавить в файл, не открывая его все время...