比如说,如果我们运行一些长命令,例如网站的功能测试,是否有一个命令,例如:
elapsed npm test
其中npm test
是可能包含多个不同命令的进程或 shell 脚本,可能需要 45 分钟。如果在运行过程中,能够每分钟或者每5分钟打印出“22分钟已过去”就太好了。
该命令time
可以显示所花费的总时间,但不能显示一路上经过的时间。
答案1
你可以使用pv -t
:
npm test | pv -t
或者为了避免npm
的输出经过,请使用不写入的pv
fd :npm
{ npm test 3>&1 >&4 4>&- | pv -t; } 4>&1
答案2
在后台启动该命令并每分钟轮询其消耗的 CPU 时间:
npm test &
while sleep 1m
do
ps -o etime $!
done
答案3
沿着l0b0 的回答:将作业放在后台,然后围绕“它还在运行吗?”这个问题运行一个繁忙循环,并沿途发出经过的分钟数:
过去
#!/bin/sh
start=$(date +%s)
"$@" &
while ps -p $! > /dev/null
do
sleep 1
now=$(date +%s)
if [ $(( (now - start) % 60)) -eq 0 ]
then
printf "%d minutes have elapsed\n" $(( (now - start) / 60))
fi
done
如果我们的进程结束而另一个进程在我们睡眠时开始,则这会带来另一个进程重复使用与我们的后台进程相同的 PID 的风险。
每隔一分钟报告经过的分钟数5分钟而不是每分钟,只需更改第一个60到一个300。