如何在特定创建的文件上用 `inotifywait` 替换 `until.. sleep`?

Posted

技术标签:

【中文标题】如何在特定创建的文件上用 `inotifywait` 替换 `until.. sleep`?【英文标题】:How to replace `until.. sleep` with `inotifywait` on a specific created file? 【发布时间】:2012-08-06 11:19:13 【问题描述】:

我有这样的代码来触发/etc/inittab中的脚本:

until test -p /tmp/updates.pipe
do
    sleep 0.25
done

在使用set -x 进行调试时,由于sleep 泛滥调试日志,我想重构。

IIUC inotifywait 只监视目录。

inotifywait -e create /tmp

那么我该如何让它只在看到 /tmp/updates.pipe 文件的 CREATE 事件后才继续,而不是 /tmp 中的任何其他文件?

【问题讨论】:

github.com/Webconverger/webc/commit/… 【参考方案1】:

grep 的 quiet 标志会导致它在看到匹配项时立即爆发。以下应该在 bash 下工作。

grep -q updates.pipe

【讨论】:

【参考方案2】:

这样的事情怎么样:

while read OUTPUT
do
    if echo $OUTPUT | grep -q "CREATE updates.pipe"; then break; fi
done < <(inotifywait -qm -e create /tmp)

不过,这不适用于所有 shell。

这是另一个适用于所有 shell 的解决方案:

inotifywait -qm -e create /tmp | while read OUTPUT
do
    if echo $OUTPUT | grep -q "CREATE updates.pipe"; then break; fi
done

但由于一些神秘的原因,它只在CREATE updates.pipe 之后的下一个输出后才中断,有人知道为什么吗?

【讨论】:

@hendry 我不知道是否有一个很好的解决方案而不产生子shell。 哦,第二个代码块没有“第二次出现”错误。好的!不确定现在保留不工作的第一个块是否有任何意义? @hendry 第一个版本应该适用于所有shell,我只是不知道为什么它不会立即中断。 好吧,它不想接受第一个块的答案,因为它不会立即中断,这有点破坏 imo 我切换了两种解决方案。如果有更好的解决方案,您可能仍需等待。

以上是关于如何在特定创建的文件上用 `inotifywait` 替换 `until.. sleep`?的主要内容,如果未能解决你的问题,请参考以下文章

Linux inotifywait常用参数说明

抑制或防止重复的 inotifywait 事件?

如何使用 inotifywait 监视文件夹而不是文件夹中的文件

inotifywait命令常用参数 Linux周末学习

inotifywait监控多个目录

如何在不使用 inotifywait 的情况下监视目录的文件更改?