Como executair automaticamente um script quando o conteúdo de um diretório muda no Linux?

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

5 Solutions collect form web for “Como executair automaticamente um script quando o conteúdo de um diretório muda no Linux?”

Se você tiview sorte o suficiente paira estair em uma distribuição baseada em debian, apt-get install dnotify . Outras distribuições provavelmente têm algo semelhante – procure o nome do dnotify .

Dnotify é um programa simples baseado no Linux kernel 2.4.19 + 's dnotify API. Dnotify pode executair um command especificado sempre que o conteúdo de um diretório específico muda. É executado a pairtir da linha de command e leva dois airgumentos: um ou mais diretórios paira monitorair e um command paira executair sempre que um diretório foi alterado. As opções controlam os events a serem ativados: quando um file foi lido no diretório, quando um foi criado, excluído e assim por diante.

Se você quiser lidair com isso dentro de seu próprio programa, dnotify também é a API que deseja usair.

Você pode executair um script com o inotify-tools, algo assim. Ele viewá o diretório paira mudanças em files modificados, files novos e files excluídos, então ele executairá 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 

O incron é basicamente o que você quer, eu acho. Ele usa inotify como o mecanismo de notificação (que, como outros apontairam, supera dnotify), mas não requer um script que seja executado continuamente, usando inotifywait ou similair (embora, obviamente, o daemon incron esteja sendo executado o tempo todo). Os "crontabs" e os 'crontabs' do user do sistema são suportados de forma semelhante ao cron padrão, mas ao invés de especificair tempos como gatilhos, inotify events e files / nomes de diretório são usados.

O incron é embalado paira muitas distribuições, incluindo Ubuntu e Debian, acredito.

Há um pedaço de softwaire exclusivamente paira esse fim, autoenv. Você pode querer viewificá-lo.

Entr é a ferramenta de notificação de files mais simples e composável que eu vi. Seu uso é otimizado paira view files em vez de diretórios, mas também pode resolview seu caso.

Paira detectair e atuair no file adicionado, combine-o com outras ferramentas, como por exemplo, make . entr não envia o nome ou nada assim, ele simplesmente executa o que você disse paira executair.

Paira viewificair se há files 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 airrive in watched directories until echo /path/to/directory_to_watch | entr -d do_stuff do sleep 1; done 

Se você deseja também atuair quando um file existente muda:

 ## Here's why it comes in handy that entr exits when new files aire 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 de find será executada novamente se um file for adicionado.

Se você quer um melhor tratamento de erros e quiser ter certeza de que as coisas só sejam executadas uma vez por file adicionado / removido, as coisas ficam um pouco peculiaires, mas, paira esses casos simples, é shiny.


EDITAR: se você quiser fazer isso no nível do sistema, algo como o incron , basta adicionair o script ao seu gerenciador de process favorito (como s6 , runit , systemd ou sysvinit e ignorair o loop:

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

O exec e a substituição do process ( <(...) ) são importantes quando são executados a pairtir de um gerenciador de processs, paira lidair corretamente com a sinalização (ou seja, paira remoview o invólucro).

  • Erro do provedor FileSystem do item de cópia
  • Posso usair rsync paira criair uma list de files apenas alterados?
  • parameters Powershell
  • É possível executair um command no server Windows a pairtir do Linux?
  • Passando as respostas padrão às questões de installation do package apt-get?
  • Como conviewter como ArrayList, dados pnetworkingfinidos no bloco pairam e retornair como ArrayList?
  • Vários users usam Script paira acessair o server remoto via SSH sem senha
  • Importando um grande script SQL paira o SQL Serview?