Como executo um script python sempre que um arquivo é criado em um diretório?

3

Então, estou tentando fazer uma tarefa simples, mas ainda não obtive êxito. Eu estou esperando que isso mude agora.

O objetivo:

Execute /var/www/lager-scanner/filer/pluk_script.py sempre que houver um novo arquivo em /var/www/lager-scanner/filer/Nav/FromNav e execute isso como o usuário www-data .

Existe alguém lá fora, como pode me dizer como fazer isso?

Todas as pastas em /var/www são de propriedade do grupo e usuário www-data e têm 775 permissões.

    
por Folkmann 09.06.2016 / 18:34

2 respostas

4

Não é um dupe, mas na resposta aceita em esta questão , é explicado como executar um script (ou qualquer comando) sempre que um arquivo é adicionado ou criado em um diretório arbitrário. No seu caso, o único acionador de eventos necessário é:

-e create

Além disso, como você não está usando o caminho para o arquivo como um argumento, é possível ignorar a --format -section.

O script para ser executado em segundo plano é simplesmente:

#!/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

Explicação

Como explicado na pergunta vinculada:

-e create

irá notar novos arquivos criados dentro do diretório.

As opções:

-m -r 

são para fazer o comando rodar indefinidamente ("monitor") e recursivamente no diretório.

De acordo com this , usando pyinotify não é a melhor opção.

EDITAR

Em um comentário que você mencionou, não funciona, e você mencionou que a pasta de destino é remota. Embora não seja exatamente o mesmo, o problema parece relacionado a isso :
a alteração não é visível para o núcleo; isso acontece inteiramente remotamente.

Um (testado) trabalho é montar a pasta remota localmente.

    
por Jacob Vlijm 11.06.2016 / 08:27
0

Aqui está uma versão reduzida do exemplo da página de inotificação no PyPI Review ( link ) para obter você começou:

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")

Cria um objeto Inotify e adiciona um diretório para observar usando o método add_watch (). Em seguida, cria um gerador de eventos a partir do objeto Inotify usando o método event_gen (). Finalmente, iterar esse gerador

Agora, as operações de arquivo que afetam o diretório observado gerarão um ou mais eventos. Cada evento assume a forma de uma tupla com quatro valores:

  • Uma tupla _INOTIFY_EVENT (omitida na saída abaixo para maior clareza)
  • Uma lista de strings que descrevem os eventos
  • O nome do diretório afetado
  • O nome do arquivo afetado

A execução do exemplo acima com a primeira declaração impressa descomentada e a criação do arquivo 'new' no diretório observado fornece esta saída:

( (...), ['IN_CREATE'], '/home/student', 'new')    
file 'new' created in '/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')

Como o evento 'IN_CREATE' ocorre quando um novo arquivo é criado, é aqui que você adiciona o código que deseja executar.

    
por quizdog 11.06.2016 / 06:58