Como usar inotify para automatizar tarefas locais no Linux

1. Introdução ao inotify e seu ecossistema

O inotify (inode notify) é um subsistema do kernel Linux que permite monitorar eventos em arquivos e diretórios do sistema de arquivos. Diferente de ferramentas baseadas em polling como o cron, que verificam alterações em intervalos fixos, o inotify opera de forma reativa — ele notifica imediatamente quando um evento ocorre, eliminando atrasos e consumo desnecessário de CPU.

Comparado a alternativas como systemd path units, o inotify oferece maior granularidade de eventos e é mais leve para monitoramentos temporários ou scripts ad hoc. Systemd path units são mais adequados para serviços persistentes e integrados ao gerenciador de sistema.

Casos de uso comuns incluem:
- Backup automático de arquivos modificados
- Sincronização de diretórios com rsync
- Recompilação automática de código-fonte
- Notificações de desktop quando arquivos são alterados
- Processamento de uploads em servidores web

2. Instalação e verificação do suporte a inotify

Antes de começar, verifique se o kernel suporta inotify:

uname -r
cat /proc/sys/fs/inotify/max_user_watches

Se o arquivo /proc/sys/fs/inotify existir, o suporte está ativado. Para instalar os utilitários de linha de comando:

Debian/Ubuntu:

sudo apt update
sudo apt install inotify-tools

RHEL/CentOS/Fedora:

sudo dnf install inotify-tools

O sistema possui três limites principais configuráveis:
- max_user_watches: número máximo de arquivos que um usuário pode monitorar (padrão 8192)
- max_user_instances: número máximo de instâncias inotify por usuário (padrão 128)
- max_queued_events: tamanho máximo da fila de eventos (padrão 16384)

Para diretórios com muitos arquivos, pode ser necessário aumentar max_user_watches:

echo 524288 | sudo tee /proc/sys/fs/inotify/max_user_watches

3. Comandos básicos do inotifywait

O inotifywait é a ferramenta principal para monitorar eventos. Sua estrutura básica:

inotifywait -m -r -e <eventos> <diretório>

Onde:
- -m: modo monitor (executa continuamente)
- -r: recursivo (monitora subdiretórios)
- -e: especifica os eventos a observar

Eventos principais:

Evento Descrição
modify Arquivo foi modificado
create Arquivo ou diretório criado
delete Arquivo ou diretório removido
move Arquivo movido de/para o diretório
attrib Atributos alterados (permissões, timestamps)
close_write Arquivo aberto para escrita foi fechado

Exemplo básico:

inotifywait -m /home/usuario/documentos

Para formatar a saída de forma legível:

inotifywait -m -r --format '%T %w%f %e' --timefmt '%H:%M:%S' /home/usuario/documentos

Isso produz saídas como:

14:32:15 /home/usuario/documentos/relatorio.txt MODIFY
14:32:18 /home/usuario/documentos/backup.zip CREATE

4. Automatização de tarefas com inotifywait e scripts

O padrão mais comum para automação é usar inotifywait dentro de um loop while read:

Exemplo 1: Backup automático de arquivos modificados

#!/bin/bash
MONITOR_DIR="/home/usuario/documentos"
BACKUP_DIR="/home/usuario/backup"

inotifywait -m -r -e modify,create --format '%w%f' "$MONITOR_DIR" |
while read FILE
do
    cp "$FILE" "$BACKUP_DIR/"
    echo "$(date): Backup de $FILE realizado" >> /var/log/backup.log
done

Exemplo 2: Recompilação automática de código-fonte

#!/bin/bash
PROJETO_DIR="/home/usuario/projeto"
COMPILE_CMD="make"

inotifywait -m -r -e close_write --format '%w%f' "$PROJETO_DIR" |
while read FILE
do
    if [[ "$FILE" == *.c || "$FILE" == *.h ]]; then
        echo "Arquivo alterado: $FILE"
        cd "$PROJETO_DIR" && $COMPILE_CMD
        if [ $? -eq 0 ]; then
            echo "Compilação bem-sucedida em $(date)"
        else
            echo "Erro na compilação em $(date)" >&2
        fi
    fi
done

5. Uso avançado com inotifywatch

O inotifywatch coleta estatísticas sobre eventos, agrupando por arquivo e tipo de evento:

inotifywatch -t 60 -r /home/usuario/documentos

Este comando monitora por 60 segundos e exibe um resumo:

total  modify  create  delete  filename
12     8       3       1       /home/usuario/documentos/relatorio.txt
5       5       0       0       /home/usuario/documentos/planilha.ods

Exemplo: Identificar os arquivos mais alterados em um diretório

#!/bin/bash
WATCH_TIME=300  # 5 minutos
DIR="/var/log"

inotifywatch -t $WATCH_TIME -e modify "$DIR" 2>/dev/null | tail -n +3 | sort -rn | head -5

Isso ajuda a identificar quais arquivos de log são mais ativos.

6. Integração com outras ferramentas do sistema

Sincronização remota com rsync:

#!/bin/bash
MONITOR_DIR="/home/usuario/sync"
REMOTE="usuario@servidor:/backup/"

inotifywait -m -r -e close_write,delete --format '%e %w%f' "$MONITOR_DIR" |
while read EVENT FILE
do
    rsync -avz --delete "$MONITOR_DIR/" "$REMOTE"
    echo "Sincronizado: $EVENT em $FILE"
done

Serviço persistente com systemd path units:

Crie o arquivo /etc/systemd/system/monitor.path:

[Unit]
Description=Monitora diretório para backup

[Path]
PathModified=/home/usuario/documentos

[Install]
WantedBy=multi-user.target

E o serviço correspondente /etc/systemd/system/monitor.service:

[Unit]
Description=Executa backup ao detectar alterações

[Service]
ExecStart=/usr/local/bin/backup-script.sh
Type=oneshot

Notificações desktop com notify-send:

#!/bin/bash
inotifywait -m -r -e create /home/usuario/Downloads |
while read DIR EVENT FILE
do
    notify-send "Novo download" "Arquivo: $FILE" -i document-save
done

7. Boas práticas e resolução de problemas

Ajustando limites permanentemente:

Para tornar as alterações de limites permanentes, edite /etc/sysctl.conf:

fs.inotify.max_user_watches=524288
fs.inotify.max_user_instances=256

Aplique com:

sudo sysctl -p

Tratamento de eventos em lote:

Para evitar execuções múltiplas quando vários arquivos são alterados rapidamente, use um timeout com --monitor:

#!/bin/bash
inotifywait -m -r -e close_write --timeout 2 /home/usuario/projeto |
while read LINE
do
    # Acumula eventos por 2 segundos antes de executar
    if [ -z "$LINE" ]; then
        make
    fi
done

Depuração e logs:

Sempre redirecione saídas para logs:

nohup ./monitor.sh > /var/log/monitor.log 2>&1 &

Teste scripts primeiro com -d (daemon mode) e --quiet para reduzir ruído.

8. Conclusão e próximos passos

O inotify é uma ferramenta poderosa para automação local no Linux, oferecendo resposta imediata a eventos do sistema de arquivos. Com os exemplos apresentados, você pode implementar backups automáticos, recompilação de código, sincronização remota e notificações personalizadas.

Para escalar o monitoramento em múltiplos diretórios, considere:
- Usar scripts que aceitam listas de diretórios como argumentos
- Implementar um gerenciador centralizado com inotifywait em paralelo
- Combinar com systemd para serviços robustos e auto-reiniciáveis

O próximo passo é explorar bibliotecas como pyinotify (Python) ou inotify (Node.js) para integrações mais complexas.

Referências