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

时间:2014-11-17 23:50:30

标签: bash timeout sh

相关问题:

question最终不需要解决。

question的解决方案不涉及timeout,但建议timeout可用于此目的。

我的问题:

此命令不会向foo.txt生成输出:

$ 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"按预期在文件foo.txt中输入:

$ timeout 2 sh -c "echo foo; sleep 5; echo bar" > foo.txt
$ cat foo.txt
foo

有谁知道为什么会发生这种情况以及如何最好地解决这个问题?这是一个玩具示例,但我运行的导致此问题的实际脚本在命令行上产生大约100行输出,但如果在终止之前超时则会使foo.txt为空。

2 个答案:

答案 0 :(得分:0)

根据我的经验,这是因为管道" |"等待" echo foo;睡5;回音栏"运行完成。因此,5s后awk可以获得输出,但是超时会在2s内终止命令,因此无法获取文本。

编辑:

也许这会有所帮助,你可以像这样将char(")移到最后:

$ 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

答案 1 :(得分:0)

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

#!/bin/sh
sh -c "echo foo; sleep 5; echo bar" | awk '/foo/ {print $1; fflush()}'
$ timeout 2 ./foo.sh > foo.txt