超时,管道中断和wc


20

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

timeout 10 zcat foo.gz | wc -c

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

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

因此,问题是:有没有一种方法可以通过某种方式阻止信号来从wc获取计数,或者使用替代方法而不是wc来打印结果,即使它获得了术语信号也是如此。


当然,还有其他选择:

  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. 制作较小的测试文件:
    嗯,这当然可以工作,并且可能是最好的解决方案。但是,这会创建很多临时文件。


6
当我读到“破坏管道和厕所”时,我想起初您的管道有问题!
dr01 2015年

Answers:


21

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

( timeout 10 <command> || true ) | wc -c

3
使失败的命令成功吗?哦,这看起来太邪恶了:D
Erathiel

17
@Erathiel想在邪恶的时候微笑吗?试试这个(相当于上面的意思):(timeout 10 <command> || :) | wc -c
Marco

1
我尝试使用subshel​​l,但没有考虑使其成功。优秀!
P.Péter

2

刚发布后,我就想到了在过程中使用命名管道:

mkfifo /tmp/x; wc -c /tmp/x & timeout 10 zcat foo.gz > /tmp/x &

这似乎有效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.