gpt4 book ai didi

linux - inotify + stdout 管道 - 输出在管道中丢失

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:54:02 25 4
gpt4 key购买 nike

我有一些用于 inotify 的单行生成事件。

while true; do for i in $(seq 1 100); do touch /tmp/ino/foo$i; sleep 1s; done; rm /tmp/ino/foo*; done

然后我设置了一个小的 bash 管道来监视该文件夹,忽略有关 ISDIR 的事件(也许我可以用 inotifywait 做到这一点,但这不相关):

inotifywait -m -e close /tmp/ino 2>/dev/null | grep -v ISDIR

这很好用,我看到像 /tmp/ino/CLOSE_WRITE,CLOSE foo57 这样的行。

但是如果我在最后添加一个额外的管道,我不会得到任何输出。为简单起见,让我们使用 grep 模式 是幂等的事实。

inotifywait -m -e close /tmp/ino 2>/dev/null | grep -v ISDIR | grep -v ISDIR

这不会产生 输出。我知道我的生成器仍在运行,另一个终端中的无管道 inotifywait -m -e close/tmp/ino 仍在产生输出。

经过一番思考,我认为这可能是一个缓冲问题(这样的问题似乎经常发生)。我将管道更改为

inotifywait -m -e close /tmp/ino 2>/dev/null | grep -v ISDIR --line-buffered | grep -v ISDIR

现在我又得到了输出,所以问题就解决了。

但是,我真的不明白为什么它在不强制行缓冲的情况下无法工作。我从来没有遇到过这样的 grep 问题,即使是“缓慢生成”的输出。然而,管道中的其他一些程序,强制 sedsed -u ,并迫使我在最后添加 fflush()每个 awk 语句。

那么,是什么在此处强制执行奇怪的缓冲,我该如何修复它(无需在手册页中乱翻以寻找深奥的强制行缓冲命令)?

最佳答案

inotifywait 可能正在缓冲。我建议使用 stdbuf :

stdbuf -oL inotifywait -m -e close /tmp/ino 2>/dev/null | grep ...

关于linux - inotify + stdout 管道 - 输出在管道中丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28175156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com