Dê uma olhada no Lsyncd
Lsyncd watches a local directory trees event monitor interface (inotify or fsevents). It aggregates and combines events for a few seconds and then spawns one (or more) process(es) to synchronize the changes.
Eu tenho necessidade de monitorar uma árvore de diretórios para qualquer alteração de arquivo. Em mudanças eu gostaria de acionar um script de backup (essencialmente um commit git, mas incluindo um dump de banco de dados).
Como espero, provavelmente haverá mais alterações em um intervalo de tempo relativamente curto que eu gostaria de esperar por n segundos antes de executar o script de backup para reduzir o número de confirmações.
Para resumir meus requisitos:
Usando javascript eu faria algo como o seguinte em qualquer alteração de arquivo:
if (timeout) {
clearTimeout(timeout);
}
timeout = setTimeout(callback, 60000);
Não estou claro como replicar esse comportamento usando um script bash. Minha abordagem atual é a seguinte:
watch.sh:
#!/bin/bash
inotifywait \
--recursive \
--monitor \
--event attrib,modify,move,create,delete \
--format %e \
/usr/src/app/html/themes/ |
while read events; do
flock -n /var/run/backup-watch.lockfile -c /usr/src/scripts/watch-backup.sh
done
watch-backup.sh:
#!/bin/bash
# wait for more changes to happen
sleep 60
# run script
/usr/src/scripts/commit-changes.sh
Isto tem o componente em espera, mas irá ignorar quaisquer mudanças que ocorram enquanto o script commit-changes.sh estiver sendo executado.
Alternativas:
Dê uma olhada no Lsyncd
Lsyncd watches a local directory trees event monitor interface (inotify or fsevents). It aggregates and combines events for a few seconds and then spawns one (or more) process(es) to synchronize the changes.
Tags backup shell-script