超时,打破管道和厕所

P.P*_*ter 20 pipe timeout

我有一个想法来快速对一些解压程序进行基准测试。例如,对于 gz,我会运行以下命令:

timeout 10 zcat foo.gz | wc -c
Run Code Online (Sandbox Code Playgroud)

这将测量解压缩器在 10 秒内可以提取的数据量。

唯一的问题是,它不起作用:因为 zcat 被杀死,wc 也被杀死,所以我没有得到字节数,只是一条Terminated消息。

所以,问题是:有没有办法从 wc 获取计数,或者通过以某种方式阻塞信号,或者使用替代方法而不是 wc 来打印结果,即使它得到一个 term 信号。


当然,还有其他选择:

  1. 写入临时文件:
    timeout 10 zcat foo.gz > /dev/shm/x ; du -sb /dev/shm/x ; rm -r /dev/shm/x 这样做的问题是使用了大量内存,并且可能会有一些性能损失。

  2. 使用 ulimit 代替:
    ulimit -t 10; zcat foo.gz | wc -c
    这也有效,但仅测量 CPU 时间,因此不会测量由于 I/O 导致的减速(例如,因为压缩更糟,需要从磁盘读取更多字节)。

  3. 制作较小的测试文件:
    嗯,这当然可以工作,并且可能是最好的解决方案。但是,这会创建大量临时文件。

Mar*_*rco 21

您可以将 timeout 命令放在子shell中并使其成功:

( timeout 10 <command> || true ) | wc -c
Run Code Online (Sandbox Code Playgroud)

  • @Erathiel 想在邪恶时微笑吗?试试这个(相当于上面的):`(timeout 10 &lt;command&gt; || :) | wc -c` (18认同)
  • 使失败的命令成功?哦,这看起来太邪恶了:D (3认同)