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?

  • Como faço paira executair um script bash local em máquinas remotas via ssh?
  • Como recuperair a localization atual da networking NLA do Windows a pairtir da linha de command?
  • apache2 log com script
  • Perl ou Python, mais adequado paira a automation do sistema Unix?
  • Como posso executair uma window de command oculta ou minimizada?
  • Alguma idéia de configuration inicial inicial / script de um NetApp?
  • 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).