Как запустить скрипт Python, когда файл создается в каталоге?
Итак, я пытаюсь сделать это, несколько простая задача, но я пока не добился успеха. Я надеюсь, что сейчас это изменится.
Цель:
Бежать /var/www/lager-scanner/filer/pluk_script.py
всякий раз, когда есть новый файл в /var/www/lager-scanner/filer/Nav/FromNav
и запустить это как www-data
пользователь.
Есть ли кто-нибудь, кто может сказать мне, как это сделать?
Все папки в /var/www
принадлежат www-data
пользователь и группа и есть 775
разрешения.
2 ответа
Не обман, но в принятом ответе на этот вопрос объясняется, как запускать скрипт (или любую команду) всякий раз, когда файл добавляется или создается в произвольном каталоге. В вашем случае единственный необходимый триггер события:
-e create
Кроме того, поскольку вы не используете путь к файлу в качестве аргумента, вы можете пропустить --format
-раздел.
Скрипт для запуска в фоновом режиме просто:
#!/bin/bash
DIR="/var/www/lager-scanner/filer/Nav/FromNav"
inotifywait -m -r -e create "$DIR" | while read f
do
# you may want to release the monkey after the test :)
echo monkey
# <whatever_command_or_script_you_liketorun>
done
объяснение
Как объясняется в связанном вопросе:
-e create
заметит новые файлы, созданные внутри каталога.
Варианты:
-m -r
заставить команду работать бесконечно ("монитор") и рекурсивно в каталоге.
Согласно этому, используя pyinotify
не самый лучший вариант.
РЕДАКТИРОВАТЬ
В комментарии вы упоминаете, что это не работает, и вы упоминаете, что целевая папка удалена. Хотя не совсем то же самое, проблема, кажется, связана с этим:
изменение не видно ядру; это происходит полностью удаленно.
(Проверенный) способ обойти удаленную папку локально.
Вот урезанная версия примера со страницы inotify на PyPI
( https://pypi.python.org/pypi/inotify), чтобы начать:
import inotify.adapters
import os
notifier = inotify.adapters.Inotify()
notifier.add_watch('/home/student')
for event in notifier.event_gen():
if event is not None:
# print event # uncomment to see all events generated
if 'IN_CREATE' in event[1]:
print "file '{0}' created in '{1}'".format(event[3], event[2])
os.system("your_python_script_here.py")
Он создает объект Inotify, а затем добавляет каталог для просмотра с помощью метода add_watch (). Затем он создает генератор событий из объекта Inotify, используя метод event_gen (). Наконец, он повторяет этот генератор
Теперь файловые операции, которые влияют на наблюдаемый каталог, будут генерировать одно или несколько событий. Каждое событие принимает форму кортежа с четырьмя значениями:
- _INOTIFY_EVENT кортеж (для ясности опущен в выходных данных ниже)
- Список строк, описывающих события
- Название затронутого каталога
- Имя затронутого файла
Выполнение приведенного выше примера с первым комментарием print без комментария и последующее создание файла 'new' в наблюдаемом каталоге дает следующий вывод:
((...), ['IN_CREATE'], '/ home / student', 'new') файл 'new' создан в '/home/student' ( (...), ['IN_ISDIR', 'IN_OPEN'], '/home/student', '') ( (...), ['IN_ISDIR', 'IN_CLOSE_NOWRITE'/home/student', '') ( (...), ['IN_OPEN'], '/home/student', 'new') ( (...), ['IN_ATTRIB'], '/home/student', 'new') ( (...), ['IN_CLOSE_WRITE'], '/home/student', 'new')
Поскольку событие 'IN_CREATE' возникает при создании нового файла, здесь вы можете добавить любой код, который хотите запустить.