使用超时

时间:2017-06-16 16:02:36

标签: bash cygwin

我想运行输出文本行的代码并在120秒内计算它输出的数字。

timeout 120 foo|wc -l 

不起作用,因为wc -l永远不会运行。

这样做的正确方法是什么?

更新

这个问题完全与cygwin有关。 timeout 120 foo > temp.txt创建一个空文件。

更新2

timeout --foreground 1 find / | wc -l

确实有效。但timeout --foreground 1 ./a.exe|wc -l会返回0

为什么会这样?

2 个答案:

答案 0 :(得分:0)

在超时时使用--foreground选项:

timeout --foreground 1 cat file|wc -l

来自男人:

--foreground   when not running timeout directly from a shell prompt,
               allow COMMAND to read from the TTY and get TTY signals;
               in this mode, children of COMMAND will not be timed out

P.S。 如果我有.cpp文件:

#include<iostream>
using namespace std;
int main()
{
for(long long i=0;i<1000000000000;i++)
cout<<i<<endl;
return 0;
}

编译:

g++ a.cpp

现在:

timeout --foreground 1 ./a.out|wc -l

输出:

991097

答案 1 :(得分:0)

一个稍微复杂的解决方案,但是对我的原始版本的timeout起作用,它不支持任何正常的标志,是使用中间文件:

F=$(mktemp)
timeout 120 foo > "${F}"
wc -l "${F}" | cut -d ' ' -f1
rm "${F}"

cut命令只是从wc的输出中删除临时文件的名称。否则是可选的。

响应OP更新的更新:

鉴于管道和缓冲的某些错综复杂的组合是错误的,solution similar question提供的Unix and Linux Stack Exchange可能就是答案:

( timeout 10 foo || true ) | wc -l

通过在单独的子shell中隔离timeout并添加|| true,您可以确保foo的终止信号永远不会影响wc。阻止输出文件在我原始尝试中生成的缓冲问题不应该影响管道(可能是?)。

最终建议

由于缓冲 似乎是一个问题,你可以尝试使用--preserve-status timeout标志,它可能会阻止命令以某种方式终止删除输出。