Este guia prático demonstra como empregar eventos do sistema de arquivos Linux (notificações) para receber alertas sempre que um novo arquivo surgir em um diretório específico. Tais eventos servem como gatilhos, possibilitando a automatização de tarefas rotineiras no seu sistema operacional.
Desenvolveremos um script que monitora um diretório e executa ações em arquivos recém-adicionados. Cada arquivo será compactado com gzip e movido para outro diretório assim que for detectado. O script se baseia no subsistema inotify, utilizando um utilitário chamado inotify-tools. Inicialmente, vamos instalar a ferramenta e realizar alguns testes.
Instalação das Ferramentas inotify e gzip
Se você utiliza o Ubuntu ou qualquer outra distribuição baseada em Debian, empregue o apt-get para instalar os pacotes necessários. Para outras distribuições Linux, use o gerenciador de pacotes padrão da sua distribuição.
sudo apt-get install inotify-tools gzip
Experimentando com as Ferramentas inotify
Começaremos observando um diretório para verificar quais eventos são gerados quando novos arquivos são adicionados. Utilizaremos a ferramenta inotifywatch, que faz parte do pacote inotify-tools. Primeiro, crie um novo diretório nomeado “chegando”:
mkdir chegando
Inicie o monitoramento deste diretório executando o seguinte comando:
inotifywatch -v chegando
Este comando instrui o inotify a monitorar todos os eventos do sistema de arquivos dentro do diretório “chegando”. A opção -v faz com que a ferramenta exiba informações adicionais sobre o que está realizando. Como não especificamos um tempo limite (-t), o comando continuará capturando eventos até que seja interrompido com CTRL + C. Neste momento, o seu terminal deverá se parecer com isto:
Abra uma nova janela de terminal (ou aba) e navegue até o diretório “chegando”. Utilize o comando touch para criar um novo arquivo nomeado “novo_arquivo”.
cd chegando/ touch novo_arquivo
Agora, retorne à primeira janela do terminal e interrompa o inotifywatch pressionando CTRL + C.
Uma tabela de eventos será exibida no console, indicando ocorrências de “criar”, “abrir”, “atribuir” e “fechar_escrita”. Esses quatro eventos ocorreram quando usamos o comando touch para criar um novo arquivo, definir seus atributos de acesso, abri-lo para inserir um caractere nulo de terminação e, finalmente, fechá-lo. Esses são apenas alguns dos vários eventos que podem ser monitorados no sistema de arquivos com as ferramentas inotify. Você pode encontrar a lista completa na página de manual do inotifywatch.
Para nossos objetivos, estaremos interessados em apenas dois eventos:
“Criar” – quando um arquivo é criado no diretório de destino.
“Movido_para” – quando um arquivo é transferido de outro local para o diretório de destino.
Vamos tentar o inotifywatch novamente, desta vez, instruindo-o a monitorar exclusivamente esses dois eventos. Execute o seguinte comando na primeira janela do terminal:
inotifywatch -v -e create -e moved_to chegando
Na segunda janela ou aba do terminal, vamos tentar criar um novo arquivo, modificar seu conteúdo e, em seguida, mover um arquivo de outro local para o diretório de destino. Todos esses comandos serão executados a partir do seu diretório inicial.
touch chegando/criado echo Testando123 >> chegando/criado touch /tmp/criado2 mv /tmp/criado2 chegando/
Retorne à primeira janela do terminal e interrompa o inotifywatch pressionando CTRL + C. Você deverá ver a seguinte saída:
Apenas dois eventos foram contabilizados: a criação de um arquivo chamado “criado” e a movimentação de um arquivo existente chamado “criado2”. Todos os outros eventos, como a modificação de “criado”, foram ignorados.
Monitorando um Diretório e Executando uma Tarefa
Agora que sabemos quais eventos rastrear, podemos usar outra ferramenta chamada inotifywait para pausar a execução até que um arquivo seja criado ou movido para o nosso diretório de destino. Usaremos os mesmos argumentos que usamos com o inotifywatch, e também especificaremos o formato que desejamos para o nome do arquivo para uso em nossa tarefa.
Antes de prosseguirmos, necessitamos de um diretório para armazenar os arquivos que já foram processados. Crie um diretório chamado “processado”:
mkdir processado
Em seguida, crie um novo script chamado “monitorar-chegada.sh” e adicione o conteúdo listado abaixo:
#!/bin/bash TARGET=~/chegando/ PROCESSED=~/processado/ inotifywait -m -e create -e moved_to --format "%f" $TARGET | while read FILENAME do echo Arquivo $FILENAME detectado, movendo e compactando mv "$TARGET/$FILENAME" "$PROCESSED/$FILENAME" gzip "$PROCESSED/$FILENAME" done
O script executa o comando inotifywait com a opção -m. Isso faz com que o comando continue monitorando indefinidamente. Cada vez que um novo evento é detectado, o nome do arquivo é passado para o comando read e atribuído à variável “FILENAME”. O bloco dentro do loop while é executado, onde o arquivo é primeiro movido para o diretório “processado” e, em seguida, compactado. O arquivo original é substituído pelo arquivo compactado e seu nome termina com a extensão “.gz”.
Vamos conceder permissões de execução ao script e executá-lo em seu diretório inicial.
chmod u+x monitorar-chegada.sh ./monitorar-chegada.sh
Abra a segunda janela do terminal e crie um novo arquivo no diretório “chegando”. Liste o conteúdo dos diretórios “chegando” e “processado” para observar os resultados do evento sendo detectado:
O arquivo de texto que copiamos para o diretório “chegando” foi detectado pelo script, copiado para “processado” e, em seguida, compactado usando gzip.
Agora podemos realizar algumas tarefas interessantes, já que podemos monitorar a chegada de novos arquivos a um diretório. Por exemplo, poderíamos adicionar marcas d’água a arquivos de imagem, compactar vídeos brutos para o formato MP4 e até mesmo enviar cada novo arquivo detectado para um bucket do Amazon S3. Este script é um ótimo ponto de partida para você criar seus próprios fluxos de trabalho e automatizar tarefas comuns no seu sistema.