inotifywait循环的可靠性

inotifywait循环的可靠性

我有一个 bash 脚本,其中有一个循环递归地监视目录:

while true
do
    if path=`inotifywait -q -r -e create --format %w%f $watchpath`; then
        #modify file
    fi
done

如果我没记错的话,这会带来这个问题:

如果在该目录中创建了许多文件,或者计算机正忙于其他任务,则可能会在inotifywait再次到达之前创建文件 - 这意味着它将被忽略。

有办法缓解这种情况吗?也许有办法持续“监视”和处理修改后的文件流/源?

答案1

inotifywait一种方法是在监视模式下运行,例如:

inotifywait -m -q -r -e create --format '%w%f' "$watchpath" |
    while read -r path; do
        : # do something with path
    done

不过,进程之间仍然会存在竞争,我不确定是否有办法使用 shell 实用程序来避免竞争条件。

即便是手册页将此列在注意事项下。

inotify API 通过文件名识别受影响的文件。但是,当应用程序处理 inotify 事件时,文件名可能已被删除或重命名。

答案2

使用监视模式-m,因此inotifywait在文件系统更改后不会退出,而是输出到标准输出。您可以将此流传输到读取器脚本中,该脚本读取 inotofywait 中的行并进行处理。

相关内容