如何使用inotifywait等待文件创建并写入超时内容

问题描述 投票:0回答:1

我在 redhat ubi-minimal 中使用 shell 命令。我想监视一个文件“./hello.txt”,该文件尚不存在。我想使用

inotifywait
来监视此文件,并等待
./hello.txt
创建并在其中写入一些非空内容,或者固定超时。

按照

inotifywait
的手册页,我尝试了:

inotifywait -m -e create -r --fromfile ./hello.txt -t 30

-m -e create
指定此命令无限期执行,直到
create
发生。

但它只给出:

Couldn't open ./hello.txt: No such file or directory
No files specified to watch!

我想知道如何指定 inotifywait 的标志来实现我的期望。

inotify
1个回答
11
投票

你不能等待

./hello.txt
,因为它还不存在,所以内核没有节点可以附加inotify对象。

您需要等待父目录(

.
)。 问题是您必须找到一种方法来仅过滤掉特定文件。 如果您的
inotifywait
版本至少为 3.20.1,则可以仅使用选项
--include
传递包含文件名的正则表达式。 如果你不这样做,......好吧,你可以尝试使用选项
--exclude
并编写一个反向正则表达式,或者你可以编写一个脚本来从外部过滤结果。这两种选择都相当不方便。 此问题的答案描述了制作过滤器的各种方法:https://unix.stackexchange.com/q/323901/133542

如果您有新版本,命令将如下所示:

inotifywait -e close_write -t 30 --include 'hello\.txt' .

几点说明:

  • 标志
    -m
    -t
    不允许一起使用(至少在我的版本中)。但是,您正在等待单个特定事件,因此不需要
    -m
  • 在您的代码中,您正在等待事件
    create
    ,但您已声明您想知道文件何时写入。我已将事件更改为
    close_write
    ,这意味着文件在以可写模式打开后正在关闭。
  • 标志
    --fromfile
    表示该文件包含要观看的文件列表,而不是它本身正在被观看。我已经删除了标志。
  • 仅当您想查看整个目录树时才需要标志
    -r
    。如果文件直接在watch目录下,则不需要。
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.