下面是我正在考虑使用 inotify 实现的一个示例 shell 脚本:
inotifywait -mrq -e close_write -e create -e delete -e move /var/www | while read file;
do
rsync -av /var/www1/ /var/www2/
done
假设 rsync 需要 30 秒才能完成。
如果5秒内有10个inotify事件,那么是否会有10个rsync进程同时运行同一项作业?
或者
是否只有一个 rsync 作业会接连运行 10 次?
答案1
它们将会一个接一个地运行,除非你在最后rsync
使用背景进行运行。&
这将同时运行它们,这不是您想要的:
inotifywait -mrq -e close_write -e create -e delete -e move /var/www | while read file
do
rsync -av /var/www1/ /var/www2/ &
done
您可能也不希望它连续运行十次。这可能是您想要的:
while inotifywait -rq -e close_write -e create -e delete -e move /var/www
do
rsync -av /var/www1/ /var/www2/
done
另外,请注意,inotifywait
在大型目录中递归运行/var/www
可能需要一段时间才能在每次调用时进行设置。您可能希望将其范围限制为仅监视活动子目录,或者仅用于cron
定期运行rsync
。
编辑:
尝试这个演示:
$ mkdir inotifytest
$ cd inotifytest
$ echo something > testfile
$ while inotifywait -rq -e access .; do echo "processing"; sleep 3; done # test 1
现在在另一个终端中执行以下操作:
$ cd inotifytest
$ for i in {1..10}; do cat testfile > /dev/null; done
在第一个终端中,您应该会看到一次“处理”。如果您再次执行for
/cat
循环(表示目录中正在添加或删除文件),您将再次看到它。
现在在第一个终端中,使用 Ctrl-C 中断循环并启动此循环:
$ inotifywait -mrq -e access .| while read file; do echo "processing"; sleep 3; done # test 2
在第二个终端中,再次运行for
/cat
循环。这次在第一个终端中,您将看到“处理”十次,每次之间有三秒钟的暂停(表示rsync
完成所需的时间。现在,如果您要for
快速连续运行循环几次,您可能需要等待一整天。