Detecta continuamente novos arquivos com inotify-tools em vários diretórios de forma recursiva


17

Acabei de instalar o inotify-tools. Gostaria de detectar continuamente novos arquivos com ferramentas de notificação em vários diretórios recursivamente e enviar um email usando o postfix. Provavelmente, posso lidar com o envio de um email usando a parte do postfix. Só estou tentando descobrir a melhor maneira de fazer isso ao tentar detectar novos arquivos. Porque às vezes vários arquivos são adicionados ao mesmo tempo.

Respostas:


39

inotifywait (parte das inotify-tools ) é a ferramenta certa para atingir seu objetivo, não importa que vários arquivos estejam sendo criados ao mesmo tempo, ele os detectará.

Aqui está um exemplo de script:

#!/bin/sh
MONITORDIR="/path/to/the/dir/to/monitor/"
inotifywait -m -r -e create --format '%w%f' "${MONITORDIR}" | while read NEWFILE
do
        echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "yourmail@addresshere.tld"
done

O inotifywait usará essas opções.

-m para monitorar o diretório indefinidamente, se você não usar esta opção, uma vez que ele detectou um novo arquivo, o script terminará.

-r monitorará os arquivos recursivamente (se houver muitos diretórios / arquivos, pode demorar um pouco para detectar os novos arquivos criados)

-e create é a opção para especificar o evento a ser monitorado e, no seu caso, deve ser criado para cuidar de novos arquivos

--format '% w% f' imprimirá o arquivo no formato /complete/path/file.name

"$ {MONITORDIR}" é a variável que contém o caminho para monitorar que definimos anteriormente.

Assim, no caso de um novo arquivo é criado, inotifywait irá detectá-lo e imprimir a saída (/complete/path/file.name) para o tubo e enquanto vai atribuir a saída para newfile variável .

Dentro do loop while, você verá uma maneira de enviar um email para o seu endereço usando o utilitário mailx que deve funcionar bem com o MTA local (no seu caso, Postfix).

Se você deseja monitorar vários diretórios, o inotifywait não permite, mas você tem duas opções: crie um script para cada diretório monitorar ou crie uma função dentro do script, algo como isto:

#!/bin/sh
MONITORDIR1="/path/to/the/dir/to/monitor1/"
MONITORDIR2="/path/to/the/dir/to/monitor2/"
MONITORDIRX="/path/to/the/dir/to/monitorx/"    

monitor() {
inotifywait -m -r -e create --format "%f" "$1" | while read NEWFILE
do
        echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "yourmail@addresshere.tld"
done
}
monitor "$MONITORDIR1" &
monitor "$MONITORDIR2" &
monitor "$MONITORDIRX" &

Eu esqueci de adicionar várias explicações sobre os comandos usados ​​no script de exemplo, e esse é o motivo para editar minha resposta ... Eu também adicionei o script, caso op deseje monitorar vários diretórios. Em relação à ferramenta inotifywait, é impossível responder à pergunta sem mencioná-la, porque op está usando inotify-tools. A propósito, eu sou um novato aqui, por isso preciso aprender muito sobre netiqueta, então, desculpe se a minha resposta se sobrepõe à sua, não era o que eu queria, só queria dar uma resposta completa à op. Mais uma vez, desculpe.
precisa saber é

Não há problema e bem-vindo ao SU. Aprender sobre netiqueta geralmente é feito da maneira mais difícil, pois não é realmente definido em lugar algum.
harrymc

4
@sahsanu Não concordo com toda a coisa da "netiqueta". Cada pessoa está respondendo à pergunta a partir da própria perspectiva. Não há sobreposição entre as respostas, nem há uma resposta que foi reescrita. É impossível que as respostas diferam dessa maneira quando a pergunta é tão específica. Muito obrigado por responder a essa pergunta em detalhes. Isso ajudou mais do que você imagina, para alguém como eu, que está apenas aprendendo sobre tudo isso. Você me salvou inúmeras horas.
David Custer


A netiqueta em um ambiente em evolução não pode ser totalmente definida. É habitual neste site não duplicar respostas, a menos que sejam mal escritas e, mesmo assim, é recomendável corrigi-las através da edição. É sempre seu direito em uma comunidade democrática não concordar. @sahsanu poderia ter evitado minha observação referindo-se à minha resposta anterior enquanto mostrava o roteiro dele, o que teria obtido sua aprovação em qualquer caso. É o que eu teria feito no lugar dele e essa é a minha netiqueta, que acredito compartilhar com os outros (mas não com todos, é claro).
precisa saber é

8

Use inotifywait , por exemplo:

inotifywait -m /path -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
        # do something with the file
    done

Para obter mais informações e exemplos, consulte o artigo
Como usar o inotify-tools para acionar scripts em eventos do sistema de arquivos .


1
Se alguém usar isso e converter as variáveis ​​da leitura em maiúsculas, você não poderá executar alguns comandos dentro desse período. Isso ocorre porque você substituiria a variável $ PATH.
Savageman

2
@ Savageman O uso de nomes de variáveis ​​em maiúsculas para suas próprias variáveis ​​é fortemente desencorajado precisamente por esse motivo. Nomes de variáveis ​​em maiúsculas são reservados para uso do sistema; suas próprias variáveis ​​devem usar letras minúsculas.
tripleee

@tripleee Obrigado pela informação, não vai usar maiúsculas vars mais :)
Savageman

0

Para vários diretórios, você pode fazer isso:

#!/bin/bash


monitor() {
  inotifywait -m -r -e attrib --format "%w%f" --fromfile /etc/default/inotifywait | while read NEWFILE
  do
     echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "yourmail@addresshere.tld"
  done
          }


monitor &

Aqui está um exemplo de lista de pastas no arquivo /etc/default/inotifywait /etc/default/inotifywait

/home/user1
/path/to/folder2/
/some/path/
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.