Мне было интересно, есть ли лучший способ проверить, была ли загрузка на ваш ftp-сервер успешной.
Система, с которой я работаю, имеет каталог загрузки, который содержит подкаталоги для каждого пользователя, куда загружаются файлы.
Файлы в этих каталогах являются временными, они удаляются после обработки.
Система просматривает каждый из этих подкаталогов и новые файлы в них, и для каждого файла проверяет, был ли он изменен в течение 10 секунд. Если он не изменялся в течение 10 секунд, система предполагает, что файл был загружен успешно.
Мне не нравится, как система в настоящее время обрабатывает эти ситуации, потому что она будет пытаться обработать файл и терпеть неудачу, если загрузка файла была неполной, вместо того, чтобы ждать и позволять пользователю возобновить загрузку до ее завершения. {1}} Это может быть хорошо для небольших файлов, загрузка которых не занимает много времени, но если файл большой, я хотел бы иметь возможность возобновить загрузку.
Мне также не нравятся циклы каталогов и файлов, система простаивает при высокой загрузке процессора, поэтому я реализовал pyinotify для запуска действия при записи файла. Я действительно не смотрел исходный код, я могу только предположить, что он более оптимизирован, чем текущая реализация (которая делает больше, чем я описал).
Однако мне все еще нужно проверить, был ли файл успешно загружен.
Я знаю, что могу проанализировать xferlog, чтобы получить все полные закачки. Например:
awk '($12 ~ /^i$/ && $NF ~ /^c$/){print $9}' /var/log/proftpd/xferlog
Это сделало бы pyinotify ненужным, поскольку я могу получить путь для полной и неполной загрузки, если я только отслеживаю журнал.
Итак, моим решением было бы проверить xferlog в моем цикле выполнения и обрабатывать только полные файлы.
Если нет лучшей практики или просто лучшего способа сделать это?
В чем заключаются недостатки этого метода?
Я запускаю свое приложение на сервере debian, и proftpd установлен на том же сервере. Кроме того, у меня нет контроля над клиентами, отправляющими файл.