使用inotify监控目录但不能100%工作

使用inotify监控目录但不能100%工作

我编写了一个 bash 脚本来监视特定目录/root/secondfolder/

#!/bin/sh

while inotifywait -mr -e close_write "/root/secondfolder/"
do
    echo "close_write"
done

fourth.txt当我创建一个名为in 的文件/root/secondfolder/并向其中写入内容、保存并关闭它时,它会输出以下内容:

/root/secondfolder/ CLOSE_WRITE,CLOSE fourth.txt

但是,它不会回显“close_write”。这是为什么?

答案1

inotifywait -m 是“监视”模式: 它永远不会退出。 shell 运行它并等待退出代码来知道是否运行循环体,但这永远不会到来。

如果删除-m,它将起作用:

while inotifywait -r -e close_write "/root/secondfolder/"
do
    echo "close_write"
done

产生

Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
/root/secondfolder/ CLOSE_WRITE,CLOSE bar
close_write
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
...

默认情况下,inotifywait 将“在第一个事件发生后退出”,这就是您想要的循环条件。


相反,您可能更喜欢阅读以下标准输出inotifywait

#!/bin/bash

while read line
do
    echo "close_write: $line"
done < <(inotifywait -mr -e close_write "/tmp/test/")

此(bash)脚本将使用以下命令将命令的每个输出行读取inotifywait$line循环内的变量中:流程替代。它避免了每次循环时都设置递归监视,这可能会很昂贵。如果您无法使用 bash,则可以将命令通过管道传输到循环中:inotifywait ... | while read line ...inotifywait在此模式下,每个事件都会生成一行输出,因此每个事件循环运行一次。

相关内容