以下是我正在使用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循环,你可能会等一整天。