【发布时间】:2010-12-12 00:02:55
【问题描述】:
是否可以通过以下组合打印shell命令的执行时间?
root@hostname:~# "command to execute" && echo "execution time"
【问题讨论】:
标签: shell command-line
是否可以通过以下组合打印shell命令的执行时间?
root@hostname:~# "command to execute" && echo "execution time"
【问题讨论】:
标签: shell command-line
只要ps -o etime= -p "<your_process_pid>"
【讨论】:
对于逐行增量测量,请尝试gnonom。
它是一个命令行实用程序,有点像 moreutils 的 ts,用于将时间戳信息添加到另一个命令的标准输出中。对于需要长时间运行的历史记录的长期运行流程很有用。
将任何内容传送到 gnomon 都会在每行前面加上一个时间戳,指示该行在缓冲区中的最后一行有多长时间 - 即下一行出现需要多长时间。默认情况下,gnomon 将显示每行之间经过的秒数,但这是可配置的。
【讨论】:
如果我要开始一个长时间运行的过程,例如复制或哈希,并且我想知道稍后需要多长时间,我就这样做:
$ date; sha1sum reallybigfile.txt; date
这将导致以下输出:
Tue Jun 2 21:16:03 PDT 2015
5089a8e475cc41b2672982f690e5221469390bc0 reallybigfile.txt
Tue Jun 2 21:33:54 PDT 2015
当然,正如这里实现的那样,它不是很精确,也不会计算经过的时间。但这很简单,有时你只需要。
【讨论】:
添加到@mob 的答案:
将%N 附加到date +%s 可以为我们提供纳秒级精度:
start=`date +%s%N`;<command>;end=`date +%s%N`;echo `expr $end - $start`
【讨论】:
在zsh中你可以使用
=time ...
在 bash 或 zsh 中你可以使用
command time ...
这些(通过不同的机制)强制使用外部命令。
【讨论】:
不要忘记 bash 的内置 time(在您执行 time command 时应默认调用)和 /usr/bin/time(应要求您通过完整路径调用它)之间存在差异。
内置的time 总是打印到stderr,但/usr/bin/time 将允许您将时间的输出发送到特定文件,因此您不会干扰执行命令的stderr 流。此外,/usr/bin/time 的格式可以在命令行或通过环境变量TIME 配置,而bash 的内置time 格式仅由@配置987654329@环境变量。
$ time factor 1234567889234567891 # builtin
1234567889234567891: 142662263 8653780357
real 0m3.194s
user 0m1.596s
sys 0m0.004s
$ /usr/bin/time factor 1234567889234567891
1234567889234567891: 142662263 8653780357
1.54user 0.00system 0:02.69elapsed 57%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+215minor)pagefaults 0swaps
$ /usr/bin/time -o timed factor 1234567889234567891 # log to file `timed`
1234567889234567891: 142662263 8653780357
$ cat timed
1.56user 0.02system 0:02.49elapsed 63%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+217minor)pagefaults 0swaps
【讨论】:
man bash: "TIMEFORMAT 变量可以设置为格式字符串,用于指定计时信息的显示方式"
help time 中错过了它,因为我只看了一眼它,我认为它是一个命令行参数.我会更新答案。
time 是大多数 shell 中的内置命令,用于将执行时间信息写入 tty。
你也可以试试
start_time=`date +%s`
<command-to-execute>
end_time=`date +%s`
echo execution time was `expr $end_time - $start_time` s.
或者在bash:
start_time=`date +%s`
<command-to-execute> && echo run time is $(expr `date +%s` - $start_time) s
【讨论】:
time 使用毫秒。如果您想在不使用变量和计算的情况下将几个命令一起计时,您可以使用括号:time ( command1 ; command2 ; command3 ) 您甚至可以将它们单独计时并加上总时间,如下所示:time ( time command1 ; time command2 ; time command3 ) 当然,如果您想要一些二十个命令,使用这个答案的解决方案可能会更好。但是,您应该开始考虑将所有命令都放在脚本中...
root@hostname:~# time [command]
它还区分使用的实时时间和使用的系统时间。
【讨论】:
time 写入 tty,而不是 stderr。我猜这会让事情变得更糟。