Executar comando quando um arquivo é alterado

9

Eu tenho um cenário em que estou carregando arquivos .csv para uma pasta específica, / tmp / data_upload, todos os dias, e os arquivos antigos são substituídos pelo novo.

Preciso executar um script Python depois que os dados forem carregados. Para isso, tenho uma ideia de criar um trabalho cron e monitorar as alterações no arquivo. Tentei usar o inotify, mas não gosto muito do domínio Unix. Como eu posso fazer isso?

Preciso executar o script test.py quando houver uma alteração de data de um arquivo na pasta de upload, por exemplo, / tmp / data_upload.

Alex
fonte
Você já viu eradman.com/entrproject , ainda não experimentou, mas parece que pode estar relacionado.
OO
Para sua informação, o Python tem inotifybibliotecas disponíveis. Veja uma das minhas respostas aqui para um exemplo: askubuntu.com/a/939392/295286
Sergiy Kolodyazhnyy

Respostas:

10

Você pode precisar de incrond (inotify cron daemon), que monitora as alterações nos arquivos e depois executa os scripts.

O Incrond pode monitorar, adicionar novos arquivos, modificar, excluir e muito mais. Este é um artigo mostra qual incrond de evento pode monitorar com algum exemplo.

Exemplo para o seu caso, você pode criar o arquivo /etc/incron.d/data_uploadcom o conteúdo

/tmp/data_upload IN_CREATE,IN_MODIFY /path/to/test.py 
victoroloan
fonte
2
Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência.
Gerald Schneider
Obrigado por me lembrar, eu adicionei o contexto para o link.
victoroloan 7/01/19
Obrigado pela resposta, apenas para verificar as etapas após a instalação do incrontab shoudl execute incrontab -ecomo root e inclua esta linha /tmp/data_upload IN_CREATE,IN_MODIFY test.py ? para que, depois de fazer upload de um novo arquivo, verifique se ele deve executar o arquivo test.py? onde devo colocar o arquivo test.py? devo precisar fornecer um caminho absoluto para isso?
Alex #
1
Eu acho que será melhor colocar o caminho absoluto para o seu script. Você também pode verificar cron ou sistema de log se o script não parece trabalhar
victoroloan
Você também pode documentar qual arquivo você está se referindo ao seu bloco de código, pessoas que não estão familiarizadas com a sintaxe do Incrond (como eu) podem pensar que estão se referindo a um comando que você deve executar na linha de comando
Ferrybig
0

O utilitário de linha de comando watchexec( https://crates.io/crates/watchexec ) parece exatamente o que você precisa, embora eu acredite que para instalá-lo, você precisa ter as ferramentas de construção do Rust instaladas em sua máquina, de modo que pode ser uma Empecilho

Ben Sandeen
fonte
1
Adoro usar software escrito com ferrugem porque você sabe que não foi abandonado em 2004 ou algo assim. Quase tem que ser novo.
Nathaniel Pisarski
0

Minha abordagem geral seria mexer com o findutilitário clássico do Unix . Por exemplo, o comando

find /tmp/upload_data/*.csv -mtime -1 -exec /home/myname/test.py

encontrará todos os .csvarquivos /tmp/upload_dataque foram modificados há menos de um dia e executará o seu, test.pyse houver algum. Obviamente, se o seu test.pyarquivo estiver em outro diretório, você deseja atualizar seu caminho para ele de acordo.

Se você executar seu crontrabalho com mais frequência do que uma vez por dia, poderá usar a mminopção findpara especificar o tempo máximo desde a modificação em minutos. Por exemplo,

find /tmp/upload_data/*.csv -mmin -60 -exec /home/myname/test.py

procurará por .csvarquivos modificados há menos de 60 minutos - útil se o cron executar o trabalho a cada hora.

Dois avisos justos estão em ordem: Primeiro, isso não captura os .csvarquivos que você excluiu totalmente. Você pode querer verificar estes separadamente. Segundo, não tive tempo de testar nada disso. Espere erros de digitação no meu código que você terá que depurar sozinho.

Thomas Blankenhorn
fonte
1
Qual é a -cmdsintaxe? O IIRC findleva -exec cmd ;...
D. Ben Knoble
Eu tentei este antes de postar esta pergunta, isso não está funcionando corretamente em 2º 3º corrida consecutiva de tarefas agendadas
Alex
@D. Ben Knoble: Você está certo. Misturei comandos find-internos com comandos shell. Fixo. Obrigado pela correção!
Thomas Blankenhorn