Как запустить скрипт 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' возникает при создании нового файла, здесь вы можете добавить любой код, который хотите запустить.

Другие вопросы по тегам