假设我有一个名为 的makefile,hour_long_recipe
顾名思义,它需要一个小时才能运行。在整个食谱的随机点上,它会问是/否问题。假设它总共问了 10 个问题。
一种可能(并且经常被推荐)的运行方式是:
yes | make hour_long_recipe
Run Code Online (Sandbox Code Playgroud)
用 回答所有问题y
。但是,根据我的理解,无论是否实际使用来自其标准输入的数据,都会yes
以高达每秒 10.2 GiB 的速度输出到标准输出make
。
即使它只有 10 MiB/s(比任何yes
可以相信的 reddit 线程的实现都慢得多),在一小时内它会加起来超过 35 GiB,其中只有 20 个字节将被读取。数据去哪儿了?可以将其保存到磁盘,但这很浪费,如果磁盘填满的速度足够快,它甚至可能导致make
失败。
据推测,操作系统会阻止它到达那个状态,但是如何呢?什么是限制,达到该限制时会发生什么?
我想观看一个文件,直到出现一些文字
我找到了这个答案:`tail -f`直到看到文字
但是当我在 ubuntu 上尝试时,它没有退出:
$ echo one > test.txt
$ echo two >> test.txt
$ echo three >> test.txt
$ echo four >> test.txt
$ cat test.txt | sed '/w/ q'
one
two
$
Run Code Online (Sandbox Code Playgroud)
按预期工作。但是当我尝试拖尾文件时
$ tail -f test.txt | sed '/w/ q'
one
two
Run Code Online (Sandbox Code Playgroud)
它永远不会退出。即使管道破裂,尾巴也不会停止。
有人知道tail
退出时如何sed
退出吗?
我正在使用一种特殊的方式,可以让我访问谷歌。现在的页面有很大不同...所以我可以正常编辑问题并评论答案。我删除了更多早期的讨论并进入正题。
当找到脚本执行下一个命令的关键字时,我想停止拖尾并返回 0。如果一分钟后没有找到关键字,整个脚本将停止并返回错误代码。我正在使用,set -euxo pipefail
这是必要的。
timeout 1m tail -Fn 0 --pid=$(ps -ef | grep "sed /$keywords" | grep -v grep | awk '{print $2}') $log_file | sed "/$keywords/q"
Run Code Online (Sandbox Code Playgroud)
我之前使用的上面的命令在我测试时接缝正常。但在 Jenkins 中,当找到关键字时,有时它会返回“构建步骤‘执行 shell’将构建标记为失败”。
我手动重启程序后找到了原因。它返回代码141。所以我查找了代码,发现它与http://www.pixelbeat.org/programming/sigpipe_handling.html中的tail -f
管道相关。|
为了我的目的,我修改了其他问题中的命令。看起来一切都很好,只是“tail -Fn 0 balabala.log”仍然留在后台,几分钟后就消失了。但它距离目标最近。
{ sed /"$keywords"/q; kill -13 $!; } < <(exec timeout 1m tail -Fn 0 $log_file)
Run Code Online (Sandbox Code Playgroud)
这超出了我的理解范围...我查阅了用法但仍然感到不确定。
- 我改为
kill -s PIPE "$!"
缩短kill -13 $!
脚本。- 我仍然对 的用法感到困惑
{ } < <()
。它们对我来说就像陌生的词......- 可以
exec …