【问题标题】:Capture output of a timed out command using Ubuntu `timeout`使用 Ubuntu `timeout` 捕获超时命令的输出
【发布时间】:2014-11-17 23:50:29
【问题描述】:

相关问题:

这个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.txt 中生成“foo”:

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

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

【问题讨论】:

    标签: bash timeout sh


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      根据我的经验,这是因为管道“|”等待 "echo foo; sleep 5; echo bar" 运行完成。所以 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-26
        • 2013-01-16
        • 1970-01-01
        • 2012-11-22
        • 2012-06-29
        • 2010-12-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多