Script Bash para observar alterações no sistema de arquivos, com atraso antes de executar um script de backup

3

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:

  • monitore um diretório recursivamente para alterações de arquivos
  • período de carência de n segundos para outras alterações antes da execução do backup
  • quaisquer alterações que ocorram durante a execução do backup não devem ser perdidas

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:

  • Eu considerei usar um script de nó js, mas o comando node fs watch não permite a visualização de diretórios recursivos, portanto, isso não é uma opção.
  • O Cron poderia ser uma alternativa, mas eu preferiria observar as alterações em vez de executá-las em um cronograma. O script de backup irá gerar um novo commit a cada vez devido ao db-dump sendo parte dele. Enquanto eu poderia fazer o backup mais complicado, verificando se há outras alterações, mas o db-dump eu gostaria de manter isso simples lá.
por pintxo 01.01.2017 / 16:26

1 resposta

2

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.

    
por 01.01.2017 / 22:31