Сценарий Bash: Контролируйте hotfolder и частичные файлы

Ваше определение ресурса пропускает атрибут driverClassName

3
задан 24 February 2013 в 17:02
3 ответа

Если ваша ОС поддерживает это, вы можете взглянуть на incrond . События, которые можно отслеживать, определены в incrontab Возможно, событие, которое вы ищете, это

IN_CLOSE_WRITE Файл, открытый для записи, был закрыт (*)

или в сочетании с

IN_CREATE File / каталог, созданный в наблюдаемом каталоге (*)

Обратите внимание, что

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

3
ответ дан 3 December 2019 в 04:58

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

Конечно, возможно, что сеть могла иметь сообщение за 10+ секунд, из-за которого передача еще не завершена, но это довольно редкое явление, и для этого нужны контрольные суммы, такие как MD5.

2
ответ дан 3 December 2019 в 04:58

Вы не сможете сделать это правильно из bash без помощи клиента.

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

Чтобы сделать это правильно, лучшим решением является загрузка клиентом файл с временным именем, затем переименуйте файл, как только он закончится, на правильное имя. Затем вы исключаете из обработки все файлы с именем «something.tmp». В противном случае попросите клиента загрузить файл блокировки с нулевым байтом, загрузить реальный файл, а затем удалить файл блокировки. Затем вы можете проверить наличие файла блокировки

filelist = ...
if [ -e /home/ftp/incoming/lockfile ]; then exit; fi
... process $filelist ...

. Если клиент загружает много, тогда файл блокировки может присутствовать каждый раз, когда вы запускаете свой скрипт, и ничего не будет сделано. В этом случае вам нужно будет сравнить временные метки файлов с файлом блокировки. Файлы старше файла блокировки должны быть полными:

for f in ...; do
    if [ ! -e /home/ftp/incoming/lockfile -o $f -ot /home/ftp/incoming/lockfile ]; then
         ... process $f
    fi
done

Если ни ваш FTP-сервер, ни ваш клиент не будут участвовать вместе с вами, вы можете сделать что-то вроде

  1. , создать список файлов и их размеров.
  2. Сравните этот список с предыдущим список файлов
  3. обрабатывает файлы в текущем списке, которые идентичны файлам в предыдущем списке
  4. сохраняет текущий список файлов поверх предыдущего списка
  5. подождите 5 минут, затем вернитесь к 1.

] Файлы, которые не стали больше за 5 минут, вероятно, уже готовы. Выполнение этого в bash оставлено в качестве упражнения для читателя.

В этом случае вам нужно будет сравнить временные метки файлов с файлом блокировки. Файлы старше файла блокировки должны быть полными:

for f in ...; do
    if [ ! -e /home/ftp/incoming/lockfile -o $f -ot /home/ftp/incoming/lockfile ]; then
         ... process $f
    fi
done

Если ни ваш FTP-сервер, ни ваш клиент не будут участвовать вместе с вами, вы можете сделать что-то вроде

  1. , создать список файлов и их размеров.
  2. Сравните этот список с предыдущим список файлов
  3. обрабатывает файлы в текущем списке, которые идентичны файлам в предыдущем списке
  4. сохраняет текущий список файлов поверх предыдущего списка
  5. подождите 5 минут, затем вернитесь к 1.

] Файлы, которые не стали больше за 5 минут, вероятно, уже готовы. Выполнение этого в bash оставлено в качестве упражнения для читателя.

В этом случае вам нужно будет сравнить временные метки файлов с файлом блокировки. Файлы старше файла блокировки должны быть полными:

for f in ...; do
    if [ ! -e /home/ftp/incoming/lockfile -o $f -ot /home/ftp/incoming/lockfile ]; then
         ... process $f
    fi
done

Если ни ваш FTP-сервер, ни ваш клиент не будут участвовать вместе с вами, вы можете сделать что-то вроде

  1. , создать список файлов и размеров файлов.
  2. Сравните этот список с предыдущим список файлов
  3. обрабатывает файлы в текущем списке, которые идентичны файлам в предыдущем списке
  4. сохраняет текущий список файлов поверх предыдущего списка
  5. подождите 5 минут, затем вернитесь к 1.

] Файлы, которые не стали больше за 5 минут, вероятно, уже готовы. Выполнение этого в bash оставлено в качестве упражнения для читателя.

for f in ...; do
    if [ ! -e /home/ftp/incoming/lockfile -o $f -ot /home/ftp/incoming/lockfile ]; then
         ... process $f
    fi
done

Если ни ваш FTP-сервер, ни ваш клиент не будут участвовать вместе с вами, вы можете сделать что-то вроде

  1. создания списка файлов и размеров файлов.
  2. Сравните этот список с предыдущим списком файлов
  3. обработайте файлы в текущем списке, которые идентичны файлам в предыдущем списке
  4. сохранить текущий список файлов поверх предыдущего списка
  5. подождите 5 минут, затем вернитесь к 1.

Файлы, которые не стали больше за Вероятно, 5 минут - это все, что они собираются сделать. Выполнение этого в bash оставлено в качестве упражнения для читателя.

for f in ...; do
    if [ ! -e /home/ftp/incoming/lockfile -o $f -ot /home/ftp/incoming/lockfile ]; then
         ... process $f
    fi
done

Если ни ваш FTP-сервер, ни ваш клиент не будут участвовать вместе с вами, вы можете сделать что-то вроде

  1. создания списка файлов и размеров файлов.
  2. Сравните этот список с предыдущим списком файлов
  3. обработайте файлы в текущем списке, которые идентичны файлам в предыдущем списке
  4. сохранить текущий список файлов поверх предыдущего списка
  5. подождите 5 минут, затем вернитесь к 1.

Файлы, которые не стали больше за Вероятно, 5 минут - это все, что они собираются сделать. Выполнение этого в bash оставлено в качестве упражнения для читателя.

  • Сравнить этот список с предыдущим списком файлов
  • обрабатывать файлы в текущем списке, которые идентичны файлам в предыдущем списке
  • сохранить текущий список файлов поверх предыдущего списка
  • ждать 5 минут, затем вернитесь к 1.
  • Файлы, размер которых не увеличился за 5 минут, скорее всего, уже готовы. Выполнение этого в bash оставлено в качестве упражнения для читателя.

  • Сравнить этот список с предыдущим списком файлов
  • обрабатывать файлы в текущем списке, которые идентичны файлам в предыдущем списке
  • сохранить текущий список файлов поверх предыдущего списка
  • ждать 5 минут, затем вернитесь к 1.
  • Файлы, размер которых не увеличился за 5 минут, скорее всего, уже готовы. Выполнение этого в bash оставлено в качестве упражнения для читателя.

    4
    ответ дан 3 December 2019 в 04:58

    Теги

    Похожие вопросы