关于 inotifywait 的问题

关于 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事件,那么是否会有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快速连续运行循环几次,您可能需要等待一整天。

相关内容