Проверьте, завершен ли ftp или нет? - PullRequest
4 голосов
/ 31 июля 2009

Я получил приложение, которое непрерывно опрашивает папку. После того, как какой-либо файл окажется в папке ftp, приложение должно переместить этот файл в другую папку для обработки.

Здесь у нас нет никакой возможности проверить, завершен ли ftp.

На технических форумах предлагается одна команда "lsof". Он получил столбец описания файла, в котором указан статус файла.

Поскольку это бесплатная команда bsd, которая отсутствует в старых версиях linux, я хочу пояснить использование этой команды.

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

Кроме того, есть ли риск при использовании этой утилиты?

Заранее признателен за помощь.

Спасибо, Мэтью Лию

Ответы [ 3 ]

4 голосов
/ 31 июля 2009

Мы делали это раньше различными способами.

Метод первый:

Если вы можете контролировать процесс отправки файлов, попросите его отправить сам файл, а затем файл дозорного. Например, отправьте реальный файл "contracts.doc" с последующим однобайтовым "contracts.doc.sentinel".

Затем попросите ваш процесс слушателя следить за файлами дозорного. Когда один из них создан, вы должны обработать эквивалентный файл данных, а затем удалить оба.

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

Метод два:

Следите за самими файлами (в частности, за последней датой / временем изменения). Обрабатывать только те файлы, у которых время модификации было больше N минут в прошлом. Это увеличивает задержку обработки файлов, но обычно вы можете быть уверены, что, если файл не был записан в течение пяти минут (например), это сделано.

Вывод:

Оба эти метода были успешно использованы нами в прошлом. Я предпочитаю первый, но нам пришлось использовать второй один раз, когда нам не разрешили изменить процесс отправки файлов.

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

1 голос
/ 31 июля 2009

Обычно существует три подхода к решению этой проблемы.

  1. предоставление файла сигнала, чтобы при передаче файла отправлялся дополнительный файл, чтобы отметить, что передача завершена
  2. добавить запись в файл журнала в этом каталоге, чтобы указать, что передача завершена (это действительно работает, только если у вас есть один узел, обновляющий каталог, чтобы избежать проблем с параллелизмом)
  3. разбора файла для определения полноты. например файл начинается с поля длины или он явно неполный? например Анализ неполного файла XML приведет к ошибке разбора из-за отсутствия конечного элемента. В зависимости от размера и формата вашего файла это может быть тривиальным или очень трудоемким процессом.

lsof может быть вариант, хотя вы определили вашу проблему переносимости Linux. Если вы используете это, обратите внимание на опцию -F, которая форматирует выходные данные, подходящие для обработки другими программами, а не для чтения человеком.

РЕДАКТИРОВАТЬ: Пакс определил четвертый (!) Метод, который я забыл - используя тот факт, что временная метка файла не обновлялась некоторое время.

0 голосов
/ 28 августа 2014

Есть пятый метод. Вы также можете проверить, активен ли сеанс FTP. Это будет работать, если каждый узел имеет свою собственную учетную запись пользователя ftp. Пока пользователь не вышел из системы с FTP, предположим, что файлы не завершены.

...