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
- Documentação oficial do kernel sobre inotify — Descrição técnica completa do subsistema inotify, incluindo chamadas de sistema e estrutura de eventos.
- Man page do inotifywait — Referência completa de todos os parâmetros, eventos e opções de formatação.
- Man page do inotifywatch — Documentação para coleta estatística de eventos com inotifywatch.
- Guia do Ubuntu Community sobre inotify — Tutorial prático com exemplos de instalação e scripts para automatização.
- Artigo da Red Hat sobre monitoramento de arquivos com inotify — Guia avançado com casos de uso em servidores e ajustes de desempenho.
- Tutorial do DigitalOcean: Como usar inotify-tools no Linux — Passo a passo para iniciantes com exemplos de scripts shell.
- Documentação do systemd.path — Como integrar monitoramento de diretórios com serviços systemd para automação persistente.