首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Ubuntu `timeout`捕获超时命令的输出

使用Ubuntu `timeout`捕获超时命令的输出
EN

Stack Overflow用户
提问于 2014-11-18 07:50:30
回答 2查看 664关注 0票数 1

相关问题:

这个question最终不需要解析。

这个question有一个不涉及timeout的解决方案,但建议timeout应该在可用的情况下用于此目的。

我的问题是:

此命令不会在foo.txt中生成输出

代码语言:javascript
复制
$ cat foo.sh 
#!/bin/sh
sh -c "echo foo; sleep 5; echo bar" | awk '/foo/ {print $1}'
$ timeout 2 ./foo.sh > foo.txt

如果我不重定向到foo.txt,我会立即看到foo按预期打印出来。

另一方面,下面的代码按照预期在文件foo.txt中生成"foo“:

代码语言:javascript
复制
$ timeout 2 sh -c "echo foo; sleep 5; echo bar" > foo.txt
$ cat foo.txt
foo

有谁知道为什么会发生这种情况,以及如何最好地解决它?这只是一个简单的例子,但我正在运行的导致此问题的实际脚本在命令行上生成了大约100行输出,但如果foo.txt在终止前超时,它也会留空。

EN

回答 2

Stack Overflow用户

发布于 2014-11-18 11:53:05

根据我的经验,这是因为pipe "|“wait "echo foo;sleep 5;echo bar”run complete .So after 5s awk可以获得输出,但超时会在2秒内终止命令,因此无法获得文本。

编辑:

也许这会有帮助,您可以像这样将char (")移到末尾:

代码语言:javascript
复制
$ cat foo.sh 
#!/bin/sh
sh -c "echo foo; sleep 5; echo bar | awk '/foo/ {print $1;}'"
$ timeout 2 ./foo.sh > foo.txt
$ cat foo.txt 
foo
票数 0
EN

Stack Overflow用户

发布于 2014-11-18 11:55:30

我找到了解决这个问题的办法。关键是在awk脚本中添加fflush(),它似乎在缓冲输出:

代码语言:javascript
复制
#!/bin/sh
sh -c "echo foo; sleep 5; echo bar" | awk '/foo/ {print $1; fflush()}'
$ timeout 2 ./foo.sh > foo.txt
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26984140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档