【Linux命令006】 time,让你知道这个命令跑了多长时间

Scroll Down

问:

在执行某些命令或脚本的时候,我们会想知道这条命令执行了多长时间。

解:

正常的思路肯定执行前打印下date,执行完打印下date。

但是在Linux中,还有个很有趣的time命令,很简单地就可以知道你这条命令执行了多长时间,并且记录了用户使用cpu的时间、系统使用cpu的时间以及实际执行的时间。

例1:

# 查看/bin目录下的文件
time ls /bin

[root@yaomm ~]# time ls /bin
[                                   dos2unix                     ipcalc             mysql                      prlimit                 systemd-escape
a2p                                 dracut                       ipcmk              mysqladmin                 prove                   systemd-firstboot
abs2rel                             dtrace                       ipcrm              mysqlbinlog                prtstat                 systemd-hwdb
……
real	0m0.055s
user	0m0.003s
sys	0m0.006s

real:实际执行时间。

user:用户占用CPU时间。

sys:系统占用CPU时间。

我们看到real time用了0分0点55秒(0m0.055s)时间。为什么real > user + sys呢?

因为real time 是包含了其他进程执行的时间和IO阻塞的时间的。

简单理解下,消失的时间大部分都是用来去做磁盘io、内存读写的工作了了。

例2:

[root@yaomm ~]# time find / -size +100M -name "*.jar"
/home/hc/jar_deploy/war/UserService.jar
/home/hc/jar_deploy/war/CommonService.jar
/home/hc/jar_deploy/war/OrderService.jar
……
real	0m1.017s
user	0m0.415s
sys	0m0.601s

我们在用type -a 命令来看看time这个命令的特殊:

[root@yaomm ~]# type -a time
time is a shell keyword
time is /usr/bin/time

可以看到time其实是一个Shell关键字。

那还有一个命令/usr/bin/time,它们有什么不同呢?

来执行一下:

# 注意,加了-v 参数
/usr/bin/time -v find / -size +100M -name "*.jar"

[root@yaomm ~]# /usr/bin/time -v find / -size +100M -name "*.jar"
/home/hc/jar_deploy/war/UserService.jar
/home/hc/jar_deploy/war/CommonService.jar
/home/hc/jar_deploy/war/OrderService.jar
/home/hc/jar_deploy/war/StoreService.jar
/home/hc/jar_deploy/war/CommunityService.jar
…………
	Command being timed: "find / -size +100M -name *.jar"
	User time (seconds): 0.42
	System time (seconds): 0.64
	Percent of CPU this job got: 99%
	Elapsed (wall clock) time (h:mm:ss or m:ss): 0:01.07
	Average shared text size (kbytes): 0
	Average unshared data size (kbytes): 0
	Average stack size (kbytes): 0
	Average total size (kbytes): 0
	Maximum resident set size (kbytes): 1576
	Average resident set size (kbytes): 0
	Major (requiring I/O) page faults: 0
	Minor (reclaiming a frame) page faults: 1396
	Voluntary context switches: 2
	Involuntary context switches: 138
	Swaps: 0
	File system inputs: 0
	File system outputs: 0
	Socket messages sent: 0
	Socket messages received: 0
	Signals delivered: 0
	Page size (bytes): 4096 
	Exit status: 0

其中详细描述了命令执行的过程。使用的cpu、io、缓存等信息。

例如

# 磁盘读取的页数据
Major (requiring I/O) page faults: 0
# 操作系统缓存读取的页数据
Minor (reclaiming a frame) page faults: 1396

结语:

本次其实共学到了三个命令:

time

/user/bin/time -v

type -a

如果觉得有趣、实用的话,不妨点个在看吧。