Обрабатывать текстовые файлы ftp, помещенные в набор каталогов на размещенном сервере. - PullRequest
0 голосов
/ 16 октября 2008

Ситуация следующая:

Серия удаленных рабочих станций собирает полевые данные и передает собранные полевые данные ftp на сервер через ftp. Данные отправляются в виде файла CSV, который хранится в уникальном каталоге для каждой рабочей станции на FTP-сервере.

Каждая рабочая станция отправляет новое обновление каждые 10 минут, что приводит к перезаписи предыдущих данных. Мы хотели бы как-то объединить или сохранить эти данные автоматически. Обработка рабочей станции ограничена и не может быть расширена, поскольку это встроенная система.

Было предложено запустить cronjob на FTP-сервере, однако есть ограничение Условий обслуживания, разрешающее cronjobs только с 30-минутными интервалами в качестве общего хостинга. Учитывая количество загружаемых рабочих станций и 10-минутный интервал между загрузками, похоже, что 30-минутный лимит cronjob между вызовами может быть проблемой.

Можно ли предложить другой подход? Доступны серверные скриптовые языки: perl, php и python.

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

Ответы [ 4 ]

4 голосов
/ 16 октября 2008

Большинство современных Linux поддерживают inotify, чтобы ваш процесс знал, когда изменилось содержимое директории, поэтому вам даже не нужно опрашивать.

Редактировать: Что касается комментария ниже от Марка Бейкера:

«Будьте осторожны, так как вы будете уведомлены, как только файл будет создан, а не когда он будет закрыт. Поэтому вам понадобится какой-то способ убедиться, что вы не заберете частичные файлы.»

Это произойдет с часами inotify, которые вы установили на уровне каталогов - способ убедиться, что вы не забираете частичный файл, это установить дополнительные часы inotify для нового файла и искать событие IN_CLOSE, чтобы что вы знаете, что файл был полностью записан.

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

4 голосов
/ 16 октября 2008

Вы можете рассмотреть постоянный демон, который продолжает опрашивать целевые каталоги:

grab_lockfile() or exit();
while (1) {
    if (new_files()) {
        process_new_files();
    }
    sleep(60);
}

Тогда ваша задача cron может просто пытаться запускать демона каждые 30 минут. Если демон не может захватить файл блокировки, он просто умирает, поэтому не стоит беспокоиться о запуске нескольких демонов.

Другим подходом, который следует рассмотреть, является отправка файлов через HTTP POST, а затем обработка их через CGI. Таким образом, вы гарантируете, что с ними обращались должным образом во время подачи.

1 голос
/ 03 апреля 2009

Если вы хотите сохранить существующую настройку FTP-сервера, я бы посоветовал использовать что-то вроде inotify или daemonized process для просмотра каталогов загрузки. Если вы согласны с переходом на другой FTP-сервер, вы можете взглянуть на pyftpdlib , который является библиотекой Python FTP-сервера.

Я уже некоторое время являюсь частью команды разработчиков pyftpdlib, и одним из наиболее распространенных запросов был способ «обработать» файлы после завершения загрузки. По этой причине мы создали метод обратного вызова on_file_received(), который запускается при завершении загрузки (подробности см. В выпуск №79 нашего средства отслеживания проблем).

Если вы чувствуете себя комфортно в Python, тогда вам может пригодиться запуск pyftpdlib в качестве FTP-сервера и выполнение кода обработки из метода обратного вызова. Обратите внимание, что pyftpdlib является асинхронным и не многопоточным, поэтому ваш метод обратного вызова не может быть блокированным. Если вам нужно запускать длительные задачи, я бы порекомендовал использовать отдельный процесс или поток Python для фактической обработки.

1 голос
/ 16 октября 2008

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

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

Вы можете использовать inotify из perl с Linux :: Inotify или из python с pyinotify.

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

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

...