如何在特定创建的文件上用 `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`?的主要内容,如果未能解决你的问题,请参考以下文章