用于监视文件系统更改的 Bash 脚本,在执行备份脚本之前延迟

用于监视文件系统更改的 Bash 脚本,在执行备份脚本之前延迟

我需要监视目录树中的任何文件更改。在更改时,我想触发一个备份脚本(本质上是一个 git 提交,但包括数据库转储)。

正如我预期的那样,在相对较短的时间内可能会有更多更改,我想在执行备份脚本之前等待 n 秒以减少提交次数。

总结一下我的要求:

  • 递归监视目录中的文件更改
  • 在执行备份之前进行进一步更改的 n 秒宽限期
  • 备份运行期间发生的任何更改都不得丢失

使用 javascript,我会对任何文件更改执行类似以下操作:

if (timeout) {
  clearTimeout(timeout);
}
timeout = setTimeout(callback, 60000);

我不清楚如何使用 bash 脚本复制此类行为。我目前的做法如下:

手表.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

手表备份.sh:

#!/bin/bash

# wait for more changes to happen
sleep 60

# run script
/usr/src/scripts/commit-changes.sh

它具有等待组件,但会忽略 commit-changes.sh 脚本运行时发生的任何更改。

备择方案:

  • 我考虑过使用node js脚本,但是node fs watch命令不允许递归目录监视,所以这不是一个选项。
  • Cron 可能是一种替代方案,但我更愿意观察变化而不是按计划运行。由于 db-dump 是备份脚本的一部分,备份脚本每次都会生成一个新的提交。虽然我可以通过检查是否有任何其他更改来使备份变得更加复杂,但是数据库转储我想保持简单。

答案1

看一眼左同步

Lsyncd 监视本地目录树事件监视器接口(inotify 或fsevents)。它会聚合并组合事件几秒钟,然后生成一个(或多个)进程来同步更改。

相关内容