Como executar automaticamente um script quando o conteúdo de um diretório é alterado no Linux?

17

Eu quero executar automaticamente um script sempre que novos arquivos são copiados em um diretório específico. Em outras palavras, existe uma maneira no Linux de "vigiar" um diretório para mudanças e então executar algo em resposta à mudança?

    
por GeneQ 05.08.2009 / 03:45

5 respostas

17

Se você tiver a sorte de estar em uma distribuição baseada no Debian, apt-get install dnotify . Outras distribuições provavelmente têm algo semelhante - procure o nome dnotify .

dnotify is a simple program based on Linux kernel 2.4.19+'s dnotify API. dnotify can execute a specified command each time the content of a specific directory changes. It is run from the command line and takes two arguments: one or more directories to monitor and a command to execute whenever a directory has changed. Options control what events to trigger on: when a file was read in the directory, when one was created, deleted and so on.

Se você quiser lidar com isso dentro do seu próprio programa, o dnotify também é a API que você deseja usar.

    
por 05.08.2009 / 04:01
12

Você pode executar um script com as ferramentas inotify, algo assim. Ele observará o diretório em busca de mudanças em arquivos modificados, novos arquivos e arquivos excluídos, e então executará o script.

#!/bin/sh
while inotifywait -e modify -e create -e delete /home/me/code; do
    rsync [options] /home/me/code/ /media/nfs/code/ 
done
    
por 05.08.2009 / 14:01
4
O

incron é basicamente o que você quer, eu acho. Ele usa inotify como o mecanismo de notificação (que, como outros apontaram, substitui o dnotify), mas não requer um script que seja executado continuamente, usando inotifywait ou similar (embora, obviamente, o daemon incron esteja em execução o tempo todo). Crontabs de todo o sistema e crontabs de usuário são suportados de forma semelhante ao cron padrão, mas ao invés de especificar tempos como triggers, inotify eventos e nomes de arquivos / diretórios são usados.

O

incron é empacotado para muitas distribuições, incluindo Ubuntu e Debian, acredito.

    
por 24.05.2010 / 19:15
0

Existe um software exclusivo para este fim, autoenv Você pode querer verificar isso.

    
por 15.08.2013 / 06:53
0
O

entr é a ferramenta de notificação de arquivos mais simples e mais composta que já vi. Seu uso é otimizado para assistir a arquivos em vez de diretórios, mas também pode resolver seu caso.

Para detectar e atuar no arquivo adicionado, combine-o com outras ferramentas, como, por exemplo, %código%. make não envia o nome ou algo assim, ele simplesmente executa o que você disse para executar.

Para verificar se há arquivos adicionados em um diretório:

## entr exits with rc=0 when terminated
## rc=1 when watched files go away or don't exist to begin with
## rc=2 when new files arrive in watched directories
until echo /path/to/directory_to_watch | entr -d do_stuff
do sleep 1; done

Se você quiser também agir quando um arquivo existente for alterado:

## Here's why it comes in handy that entr exits when new files are added --
## find gets re-run.
until find /path/to/directory_to_watch/ -path /path/to/directory_to_watch/* |
    entr -d do_stuff
do sleep 1; done

... e é aí que o mecanismo de loop é útil, pois a expressão entr será executada novamente se um arquivo for adicionado.

Se você quiser um melhor tratamento de erros e quiser ter certeza de que as coisas só serão executadas uma vez por arquivo adicionado / removido, as coisas ficam um pouco estranhas, mas para esses casos simples é brilhante.

EDIT: Se você quiser fazer isso em um nível de sistema, algo como incron , basta adicionar o script ao seu gerenciador de processos favorito (como s6 , runit , systemd ou sysvinit e pule o loop:

#!/bin/bash
exec entr -d do_stuff < <(find /path/to/directory_to_watch/ -path /path/to/directory_to_watch/*)

O find e a substituição do processo ( exec ) são importantes quando executados a partir de um gerenciador de processos, para manipular a sinalização corretamente (ou seja, para tirar o shell do caminho).

    
por 21.07.2016 / 12:45