我有一个想法来快速对一些减压程序进行基准测试。例如,对于 gz,我将运行命令:
timeout 10 zcat foo.gz | wc -c
这将测量解压缩器在 10 秒内可以提取的数据量。
唯一的问题是,它不起作用:当 zcat 被杀死时,wc 也被杀死,所以我没有得到字节数,只是一条Terminated
消息。
所以,问题是:有没有办法从 wc 获取计数,要么通过某种方式阻止信号,要么使用替代方案来代替 wc,即使它收到术语信号也可以打印结果。
当然,还有其他选择:
写入临时文件:
timeout 10 zcat foo.gz > /dev/shm/x ; du -sb /dev/shm/x ; rm -r /dev/shm/x
这样做的问题是使用大量内存,并且还可能会产生一些性能损失。使用 ulimit 代替:
ulimit -t 10; zcat foo.gz | wc -c
这也有效,但仅测量 cpu 时间,因此不会测量由于 I/O 导致的速度减慢(例如,因为压缩更差,并且需要从磁盘读取更多字节)。制作较小的测试文件:
嗯,这当然可以工作,并且可能是最好的解决方案。但是,这会创建大量临时文件。
答案1
您可以将超时命令放在子 shell 中并使其成功:
( timeout 10 <command> || true ) | wc -c
答案2
发布后,我想到在该过程中使用命名管道:
mkfifo /tmp/x; wc -c /tmp/x & timeout 10 zcat foo.gz > /tmp/x &
这似乎有效。
答案3
您还可以使用该timeout --foreground
选项,使超时仅考虑立即进程,而不考虑与管道关联的整个进程组