我想运行输出文本行的代码并在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
。
为什么会这样?
答案 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
的输出中删除临时文件的名称。否则是可选的。
鉴于管道和缓冲的某些错综复杂的组合是错误的,solution similar question提供的Unix and Linux Stack Exchange可能就是答案:
( timeout 10 foo || true ) | wc -l
通过在单独的子shell中隔离timeout
并添加|| true
,您可以确保foo
的终止信号永远不会影响wc
。阻止输出文件在我原始尝试中生成的缓冲问题不应该影响管道(可能是?)。
由于缓冲 似乎是一个问题,你可以尝试使用--preserve-status
timeout
标志,它可能会阻止命令以某种方式终止删除输出。