我有一个 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 中的行并进行处理。