关于inotifywait的问题

以下是我正在使用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事件,那么rsync会有10个进程同时运行同一个job吗?

要么

是否只有一个运行10次的rsync作业,一个接一个?

除非你最后使用&背景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 

此外,请注意,在大型/var/www上recursion运行inotifywait可能需要一段时间才能在每次调用时进行设置。 您可能希望将其范围限制为仅查看活动的子目录,或者仅使用cron来定期运行rsync

编辑:

试试这个演示:

 $ mkdir inotifytest $ cd inotifytest $ echo something > testfile $ while inotifywait -rq -e access .; do echo "processing"; sleep 3; done # test 1 

现在在另一个terminal,做这个:

 $ cd inotifytest $ for i in {1..10}; do cat testfile > /dev/null; done 

在第一个terminal中,您应该看到一次“处理”。 如果您再次执行for / cat循环(代表在您的目录中添加或删除的文件),您将再次看到它。

现在在第一个terminal中,用Ctrl-C中断循环并启动这个循环:

 $ inotifywait -mrq -e access .| while read file; do echo "processing"; sleep 3; done # test 2 

在第二个terminal中,再次运行for / cat循环。 这次在第一个terminal中,你会看到“处理”十次,每次之间停顿三秒钟(表示rsync完成的时间,现在如果你连续几次运行for循环,你可能会等一整天。