我需要监视目录树中的任何文件更改。在更改时,我想触发一个备份脚本(本质上是一个 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)。它会聚合并组合事件几秒钟,然后生成一个(或多个)进程来同步更改。