![如何对命令进行“计时”N 次(并且能够使用 CTRL-C 来停止它)](https://linux22.com/image/168808/%E5%A6%82%E4%BD%95%E5%AF%B9%E5%91%BD%E4%BB%A4%E8%BF%9B%E8%A1%8C%E2%80%9C%E8%AE%A1%E6%97%B6%E2%80%9DN%20%E6%AC%A1%EF%BC%88%E5%B9%B6%E4%B8%94%E8%83%BD%E5%A4%9F%E4%BD%BF%E7%94%A8%20CTRL-C%20%E6%9D%A5%E5%81%9C%E6%AD%A2%E5%AE%83%EF%BC%89.png)
简短的问题:
这是在 Mac 上完成的:
time for i in {1..10}; do python3 foo.py ; done
但 CTRL-C 无法阻止它。如何让它发挥作用? (或者如何计时N次的运行时间?)
细节:
github上有一些标准的程序测试,我可以运行它:
python3 foo.py
或者
time python3 foo.py
它报告运行时间为 0.27 秒。由于测试已连接 1000 个测试用例并连接到测试框架,因此我不想更改测试,因此我想对其计时 100 次。看起来这个命令time
没有办法计时 10 或 100 次(这对 Unix 来说有点奇怪,这么多年了,这么有用和简单的东西还没有内置到 Unix 中time
)。可以使用以下内容:
time for i in {1..10}; do python3 foo.py ; done
但是 CTRL-C 无法停止它——它会停止那个 python 脚本并继续运行其余的脚本。幸运的是它不是100
或者1000
是输入的。有没有办法使用time
或更好的方法来做到这一点? (除了改变程序?)
答案1
这是不可能的,Ctrl-C
因为您是在循环中生成新进程。您必须Ctrl-C
按每次迭代执行速度的 100、1000 倍来中断所有这些操作。作为替代方案,您可以通过按
来实现相同的效果,这将停止由循环创建的最新前台进程,并且bash
Ctrl-Z
辞职循环本身。
答案2
假设 shell 是zsh
,只需执行以下操作:
time (repeat 10 python3 foo.py)
运行子 shell 的进程(并等待子进程)运行 python3 命令 10 次。
使用bash
或ksh93
(或zsh
),您可以执行以下操作:
time (for ((i=0;i<10;i++)) { python3 foo.py; })
POSIXly,你可以这样做:
time -p sh -c '
i=0; while [ "$i" -lt 10 ]; do
python3 foo.py
i=$((i + 1))
done'
答案3
这不是“Ctrl+C”解决方案,而是如果您想“优雅地”停止长循环序列的解决方案。您所需要做的就是创建./stop-foo-py
文件;例如$ echo "" > ./stop-foo-py
(在另一个终端中)。
rm ./stop-foo-py
time for ((i=0;i<1000;i++));
do if [ ! -f "./stop-foo-py" ]; then
python foo.py ;
fi ;
done
或rm ./stop-foo-py; time for ((i=0;i<1000;i++)); do if [ ! -f "./stop-foo-py" ]; then python foo.py ; fi ; done
排成一行。
大约增加了一半多发性硬化症每个循环。
$ time for ((i=0;i<1000;i++)); do if [ ! -f "./stop" ]; then : ; fi ; done
real 0m0.548s
user 0m0.157s
sys 0m0.359s