Quero executar automaticamente um script sempre que novos arquivos são copiados para um diretório específico. Em outras palavras, existe uma maneira no Linux de "observar" um diretório para alterações e executar algo em resposta à mudança?
17
Respostas:
Se você tiver sorte o suficiente para estar em uma distribuição baseada no debian
apt-get install dnotify
,. Outras distribuições provavelmente têm algo parecido - procure odnotify
nome.Se você quiser lidar com isso dentro do seu próprio programa, dnotify também é a API que você deseja usar.
fonte
emerge inotify-tools
Você pode executar um script com as ferramentas inotify, algo como isto. Ele observará o diretório quanto a alterações nos arquivos modificados, novos e excluídos, e executará o script.
fonte
incron é basicamente o que você quer, eu acho. Ele usa inotify como mecanismo de notificação (que, como outros já 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' em todo o sistema e 'crontabs' do usuário são suportados de maneira semelhante ao cron padrão, mas, em vez de especificar horários como acionadores, são utilizados eventos inotify e nomes de arquivos / diretório.
O incron é empacotado para muitas distribuições, incluindo Ubuntu e Debian, acredito.
fonte
Existe um software apenas para esse fim, autoenv. Você pode querer verificar.
fonte
entr é a ferramenta de notificação de arquivos mais simples e mais fácil de compor que já vi. Seu uso é otimizado para assistir arquivos, e não diretórios, mas também pode resolver o seu caso.
Para detectar e atuar no arquivo adicionado, combine-o com outras ferramentas, como por exemplo
make
.entr
não envia o nome ou algo assim, simplesmente executa o que você pediu para executar.Para verificar se há arquivos adicionados em um diretório:
Se você também deseja agir quando um arquivo existente é alterado:
... e é aí que o mecanismo de loop é útil, pois a
find
expressão será executada novamente se um arquivo for adicionado.Se você deseja um melhor tratamento de erros e deseja garantir que as coisas sejam executadas apenas uma vez por arquivo adicionado / removido, as coisas ficam um pouco peculiares, mas, para esses casos simples, é brilhante.
EDIT: Se você quiser fazer isso no nível do sistema, algo como incron , basta adicionar o script ao seu gerenciador de processos favorito (como s6 , runit , systemd ou sysvinit e pular o loop:
A
exec
substituição e o processo (<(...)
) são importantes ao executar a partir de um gerenciador de processos, para lidar com a sinalização corretamente (ou seja, para tirar o shell do caminho).fonte