您如何找出正在运行的进程需要多长时间才能完成?
例子:
date; dd bs=1m if=/foo of=bar; date
^此示例只有 1 秒的分辨率。
任何外壳都是可以接受的。
答案1
使用time
:
$ time somecommand --with=somearguments
time
将执行命令行的其余部分(在本例中somecommand --with=somearguments
),当命令完成时,它将打印经过的时间。
示例输出:
$ time somecommand --with=somearguments
...
... (output of somecommand)
...
real 0m5,020s
user 0m0,010s
sys 0m0,010s
您通常需要的信息是real
。在此示例中,该命令大约需要 5 秒。有关其他号码的更多信息,请参见此处:https://stackoverflow.com/questions/556405/what-do-real-user-and-sys-mean-in-the-output-of-time1
上面的示例输出来自 bash 内置命令。time
是大多数 shell 中的内置命令。还有系统time
。它具有不同的输出格式,但在其他方面的行为与 shell 内置函数基本相同。
要使用系统命令,您可以这样做:
$ /usr/bin/time somecommand --what=islove
或者
$ env time somecommand --baby=donthurtme
还有更多,但这超出了本问答的范围。
使用系统的示例输出time
:
$ env time somecommand --donthurtme=nomore
...
... (output of somecommand)
...
0.00user 0.01system 0:06.02elapsed 0%CPU (0avgtext+0avgdata 3656maxresident)k
0inputs+0outputs (0major+1089minor)pagefaults 0swaps
您通常需要的信息是elapsed
。在此示例中,该命令大约需要 6 秒。对于其他数字的含义,我在互联网上没有找到很好的解释。你必须阅读手册页:http://man7.org/linux/man-pages/man1/time.1.html
有关 shell 内置命令和系统命令之间差异的更多信息,请参阅此处:内置命令和非内置命令有什么区别?
有关如何调用系统命令的更多信息,请参见此处:使用系统命令而不是内置的 Bash 而不指定完整路径
系统时间输出更加灵活。这里有一些演示
您可以更改系统的输出time
。例如,用于-p
获取类似于 shell 内置的输出time
:
$ /usr/bin/time -p somecommand --what=isyourname
...
real 0:06.02
user 0.00
sys 0.01
或使用-f
编写您自己的格式:
$ /usr/bin/time -f %E somecommand --what=isyourquest
...
0:06.02
%E
是“过去”的部分。您通常最感兴趣的部分。
为了完整性:您还可以time
通过更改此变量来更改 bash 内置输出格式:TIMEFORMAT
。更多信息:https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html#index-TIMEFORMAT
如何重定向或捕获输出
用于演示观察命令hellostdoutstderr
:
#!/bin/sh
sleep 0.5
echo "hello out"
echo "hello err" >&2
调用示例:
$ ./hellostdoutstderr
hello out
hello err
分别捕获 stdout 和 stderr
$ ./hellostdoutstderr >stdoutfile 2>stderrfile
$ cat stdoutfile
hello out
$ cat stderrfile
hello err
系统time
打印到 stderr,以便通过 stderr 重定向捕获它
$ /usr/bin/time ./hellostdoutstderr >stdoutfile 2>stderrfile
$ cat stdoutfile
hello out
$ cat stderrfile
hello err
0.00user 0.00system 0:00.50elapsed 1%CPU (0avgtext+0avgdata 3672maxresident)k
0inputs+16outputs (0major+311minor)pagefaults 0swaps
您可以告诉系统time
打印到单独的文件
$ /usr/bin/time -o timeoutfile ./hellostdoutstderr >stdoutfile 2>stderrfile
$ cat stdoutfile
hello out
$ cat stderrfile
hello err
$ cat timeoutfile
0.00user 0.00system 0:00.50elapsed 1%CPU (0avgtext+0avgdata 3676maxresident)k
0inputs+16outputs (0major+309minor)pagefaults 0swaps
请注意,即使 stdout 和 stderr 被重定向,bash 内置命令time
也始终会打印到终端。这是可能的,因为它是内置的并且可以做任何它喜欢的事情(在 shell 中)
$ time ./hellostdoutstderr >stdoutfile 2>stderrfile
real 0m0,511s
user 0m0,005s
sys 0m0,006s
在此示例中,stdout 和 stderr 都重定向到文件。但 bash 内置命令time
仍然打印到终端。
通过一些技巧,仍然可以捕获 bash 内置函数的输出。但如果使用系统命令更容易,为什么还要对抗 bash呢?如果您愿意,这里有更多信息:https://www.cyberciti.biz/faq/unix-linux-time-command-examples-usage-syntax/
要计时更复杂的命令,您有多种选择
如果你只想一个接一个地对两个命令计时
$ time { command1 ; command2 ; }
也适用于管道
$ time { command1 | command2 ; }
对于更复杂的东西
$ time sh -c ' complex command chain '
但请注意引用和其他恶作剧。最好将命令放入脚本中并为脚本计时:
$ time ./script.sh
TL;DR:time
在命令之前添加。如果您想测量脚本内的时间,请使用/usr/bin/time
.