обрабатывать файлы в каталоге по мере их появления

Возможный дубликат:
Как запустить команду при обновлении содержимого каталога?

Я пытаюсь написать простой процесс etl, который будет искать файлы в каталоге каждую минуту, и если да, загрузите их в удаленную систему (через скрипт), а затем удалите их.

Все, что усложняет это: загрузка может занять более минуты. Чтобы обойти это, я решил, что могу переместить все файлы во временный каталог обработки, действовать там, а затем удалить их оттуда. Кроме того, в попытке улучшить скрипты командной строки, я пытаюсь сделать более элегантное решение. Я начал писать простой скрипт для выполнения моей задачи, как показано ниже:

#!/bin/bash for i in ${find /home/me/input_files/ -name "*.xml"}; do FILE=$i; done; BASENAME=`basename $FILE` mv $FILE /tmp/processing/$BASENAME myscript.sh /tmp/processing/$BASENAME other_inputs rm /tmp/processing/$BASENAME 

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

Однако это U / Linux в конце концов. Я чувствую, что я мог бы выполнить все это в одной строке, прокладывая трубку и перемещая вещи, а не громоздкий сценарий для поддержки.

Кроме того, использование параллельного параллельного процесса было бы плюсом.

Добавление : может быть ответом на то, что некоторая очередь FIFO. Или, может быть, какой-то другой наблюдатель из каталога вместо cron. Я открыт для всех предложений, которые более элегантны, чем мой маленький скрипт. Только проблема заключается в том, что файлы в «каталоге ввода» затрагивают моменты, прежде чем они на самом деле записаны, поэтому некоторые из них! -size -0 потребуется только для обработки реальных файлов.

3 Solutions collect form web for “обрабатывать файлы в каталоге по мере их появления”

Звучит так, как будто вы просто должны написать небольшой скрипт обработки и использовать параллельную обработку GNU Parallel:

http://www.gnu.org/software/parallel/man.html#example__gnu_parallel_as_dir_processor

Так что-то вроде этого:

 inotifywait -q -m -r -e CLOSE_WRITE --format %w%f my_dir | parallel 'mv {} /tmp/processing/{/};myscript.sh /tmp/processing/{/} other_inputs; rm /tmp/processing/{/}' 

Смотрите видеоролики, чтобы узнать больше: http://pi.dk/1

Редактировать:

Требуется, чтобы myscript.sh мог обрабатывать файлы длиной 0 (например, игнорировать их).

Если вы можете избежать touch вы можете даже сделать:

 inotifywait -q -m -r -e CLOSE_WRITE --format %w%f my_dir | parallel myscript.sh {} other_inputs 

Установка GNU Parallel проста:

 wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel chmod 755 parallel 

Во-первых, ваш скрипт будет работать с одним файлом (последним в списке). Кроме того, я не думаю, что один лайнер всегда уместен или элегантен. Cron много делает за кулисами, и вам нужно иметь возможность просматривать вещи, которые не срабатывают. Часто может быть запущен cron «часто». Вы можете завершить десятки этих процессов, замедляя работу систем, поскольку все они пытаются обработать файлы в очереди.

Это то, что я сделал бы.

 Dir="$HOME/input_files" # never hardcode when you have variables for filename in "$Dir"/*.xml; do # is the file non-empty AND is it still there, or may caught by another # process if [ -s "$filename" ]; then # move files locally will be faster than crossing filesystems to /tmp mkdir -p "$Dir/.processing" # temp name should use pid, just in case another input with the same name comes in tempname="$Dir/.processing/`basename $filename .xml`.$$" mv "$filename" "$tempname" # send stdout and stderr to a .output file myscript.sh "$tempname" other_inputs > "$tempname.output" 2>&1 rc=$? if [ $rc -eq 0 ]; then rm "$tempname" "$tempname.output" else echo "Error processing $filename; rc=$rc" >&2 echo "File in $tempname" >&2 fi done 

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

Используйте интерфейс inotify (7) для контроля входящего каталога, а не опроса через cron. Инструменты inotify предоставляют вам программу inotifywait, которую вы можете использовать для мониторинга каталога, если вы не хотите писать код против интерфейса системного вызова.

  • Найти каталоги, которые не содержат подкаталогов
  • Необходимо улучшить функцию urlencode
  • Завершение скрипта оболочки bash, работающего в фоновом режиме
  • Передавать аргументы команде, запущенной другим пользователем
  • Нужна помощь с скриптом оболочки, используемым для работы cron
  • Найти все старые версии на основе версии в имени файла
  • используя stdout дважды (но не tee, как я знаю)
  • Расширенное использование / команда оболочки
  • когда использовать двойные кавычки с переменной в сценарии оболочки?
  • Создайте новую ссылку для доступа ко всем файлам и папкам
  • Есть что-то вроде «split ()» JavaScript в оболочке?
  • Interesting Posts

    Ошибка тестирования DocBook DSSSL

    Fedora 17: горячая клавиша для терминала

    Ошибка: команда не найдена

    Как удалить. с начала строки Bash и записать результат в переменную?

    Прервать процесс ядра или другое прерывание

    Удалить yum repo с помощью yum

    Файловый менеджер Thunar: Сортировка по сокращенной клавиатуре?

    генерирование «полезных» обратных отображений в kubuntu

    conntrack в iptables не работает

    Принцип наименьшей привилегии: действительно ли помощнику Authbind нужен root setuid или он может работать с cap_net_bind_services?

    Пароль защищает PDF-файл с помощью AES 256

    Переименование пакетного файла: лучше, чем случайный идентификатор, чтобы предотвратить удаление файлов с повторяющимися именами файлов?

    Imagemagick: установить параметры IPTC в jpeg-изображении

    вернуться к initramfs при завершении работы

    Могу ли я установить тайм-аут bash только для виртуальных консолей (ctrl + alt + {f1-f6})

    Linux и Unix - лучшая ОС в мире.