43

抓狂!这条命令执行完女朋友都跟人跑了!

 4 years ago
source link: http://os.51cto.com/art/201907/600196.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

抓狂!这条命令执行完女朋友都跟人跑了!

对于时间的测试,我们可以用到一个命令:time 。下面我们就详细看看如何使用 time 命令来对脚本/命令进行测时。

作者:良许来源:良许Linux|2019-07-25 07:50

作为程序员,时间是金钱,效率是绳命,万一遇到产品经理临时又加需求,我们常常是这个状态:

32be4c97bc1378b6f472f345b05d37b2.jpg-wh_651x-s_4183486479.jpg

如果是这个状态,那已经是很好的状况了。万一如果因为工作忙碌没时间陪女朋友,那么就很可能免费获赠一顶精致的 绿 帽 子……

ce5da487e25e9621505934da12e0d69b.jpg

其实不仅仅是我们程序员工作忙,很多系统对时间的要求性也非常高。在工作中,还有很多情况下需要测试一个脚本或者程序运行多少时间,特别是对于时间性要求比较高的系统更是如此。

我们在工作中,写过一个 Shell 脚本,这个脚本可以从 4 个 NTP 服务器轮流获取时间,然后将最可靠的时间设置为系统时间。

因为我们对于时间的要求比较高,需要在短时间内就获取到正确的时间。所以我们就需要对这个脚本运行时间进行测试,看看从开始运行到正确设置时间需要花费多少时间。

对于时间的测试,我们可以用到一个命令:time 。下面我们就详细看看如何使用 time 命令来对脚本/命令进行测时。

a1161b40f55c3bb4fea02bed3ee89b7d.jpg

1. time 命令基本用法

time 命令最基本的用法,就是 time + 命令 ,比如:

  1. $ time ping baidu.com 
  2. PING baidu.com (123.125.114.144) 56(84) bytes of data. 
  3. 64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=1 ttl=56 time=2.83 ms 
  4. 64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=2 ttl=56 time=2.77 ms 
  5. --- baidu.com ping statistics --- 
  6. 8 packets transmitted, 8 received, 0% packet loss, time 10818ms 
  7. rtt min/avg/max/mdev = 2.765/2.808/2.862/0.039 ms 
  8. real    0m11.173s 
  9. user    0m0.004s 
  10. sys     0m0.002s 

在结果里,real 表示从我们执行 ping 命令到最终按 ctrl+c 终止这段时间所耗费的时间;user 及 sys 分别表示 ping 命令在用户空间及内核空间所运行的时间。

2. 将时间信息写入文件

如果我们想把时间信息直接写入到文件,而不是显示在屏幕上,那么我们可以使用 -o 选项,并指定写入的文件路径。

  1. $ /usr/bin/time -o /home/alvin/time-output.txt ping baidu.com 

执行这个命令后,ping 命令的输出结果依然会在终端里,而 time 命令的结果就写入到我们所指定的 time-output.txt 文件里。

-o 选项表示输出文件不存在就创建,如果存在的话就直接覆盖重写。如果我们不想覆盖重写,而是想追加在文件后面,我们可以使用 -a 选项。

  1. $ /usr/bin/time -a /home/smart/time-output.txt ping linoxide.com 
daa4d62bbaf3b8e87a1a933cc4d672bd.gif

3. 显示更详细的时间信息

time 命令不带选项的话,显示的信息量比较少,如果我们想获得更详细的信息,那么我们可以使用 -v 选项。

  1. $ /usr/bin/time -v ping baidu.com 
  2. PING baidu.com (123.125.114.144) 56(84) bytes of data. 
  3. 64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=1 ttl=56 time=2.75 ms 
  4. 64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=2 ttl=56 time=2.76 ms 
  5. 64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=3 ttl=56 time=2.85 ms 
  6. 64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=4 ttl=56 time=2.77 ms 
  7. --- baidu.com ping statistics --- 
  8. 4 packets transmitted, 4 received, 0% packet loss, time 3300ms 
  9. rtt min/avg/max/mdev = 2.751/2.785/2.851/0.075 ms 
  10.         Command being timed: "ping baidu.com" 
  11.         User time (seconds): 0.00 
  12.         System time (seconds): 0.00 
  13.         Percent of CPU this job got: 0% 
  14.         Elapsed (wall clock) time (h:mm:ss or m:ss): 0:03.64 
  15.         Average shared text size (kbytes): 0 
  16.         Average unshared data size (kbytes): 0 
  17.         Average stack size (kbytes): 0 
  18.         Average total size (kbytes): 0 
  19.         Maximum resident set size (kbytes): 2140 
  20.         Average resident set size (kbytes): 0 
  21.         Major (requiring I/O) page faults: 0 
  22.         Minor (reclaiming a frame) page faults: 626 
  23.         Voluntary context switches: 10 
  24.         Involuntary context switches: 0 
  25.         Swaps: 0 
  26.         File system inputs: 0 
  27.         File system outputs: 0 
  28.         Socket messages sent: 0 
  29.         Socket messages received: 0 
  30.         Signals delivered: 0 
  31.         Page size (bytes): 4096 
  32.         Exit status: 0 

这个结果信息就相当详细了,我们可以获取到足够多我们所需要的信息。

4. 自定义输出格式

默认情况下,time 命令只输出 real,usr,sys 三个内容,如果我们想要个性化一些,算定义它的输出格式,time 命令也是支持的。time 命令支持的格式有很多,如下所示:

  1. C - Name and command line arguments used 
  2. D - Average size of the process's unshared data area in kilobytes 
  3. E - Elapsed time in a clock format 
  4. F - Number of page faults 
  5. I - Number of file system inputs by the process 
  6. K - Average total memory use of the process in kilobytes 
  7. M - Maximum resident set the size of the process during the lifetime in Kilobytes 
  8. O - Number of file system outputs by the process 
  9. P - Percentage of CPU that the job received 
  10. R - Number of minor or recoverable page faults 
  11. S - Total number of CPU seconds used by the system in kernel mode 
  12. U - Total number of CPU seconds used by user mode 
  13. W - Number of times the process was swapped out of main memory 
  14. X - Average amount of shared text in the process 
  15. Z - System's page size in kilobytes 
  16. c - Number of times the process was context-switched 
  17. e - Elapsed real time used by the process in seconds 
  18. k - Number of signals delivered to the process 
  19. p - Average unshared stack size of the process in kilobytes 
  20. r - Number of socket messages received by the process 
  21. s - Number of socket messages sent by the process 
  22. t - Average resident set size of the process in kilobytes 
  23. w - Number of time the process was context-switched voluntarily 
  24. x - Exit status of the command 

如果我们想要输出以下这样的格式:

  1. Elapsed Time = 0:01:00, Inputs 2, Outputs 1 

我们可以这样自定义:

  1. $ /usr/bin/time -f "Elapsed Time = %E, Inputs %I, Outputs %O" ping baidu.com 
  2. PING baidu.com (220.181.38.148) 56(84) bytes of data. 
  3. 64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=1 ttl=54 time=1.82 ms 
  4. 64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=2 ttl=54 time=1.86 ms 
  5. --- baidu.com ping statistics --- 
  6. 4 packets transmitted, 4 received, 0% packet loss, time 3003ms 
  7. rtt min/avg/max/mdev = 1.825/1.859/1.879/0.056 ms 
  8. Elapsed Time = 0:03.92, Inputs 0, Outputs 0 

如果你想让输出的结果有换行,可以在对应的地方添加 \n ,比如:

  1. $ /usr/bin/time -f "Elapsed Time = %E \n Inputs %I \n Outputs %O" ping baidu.com 

这样输出的结果就类似于这样:

  1. Elapsed Time = 0:03.92 
  2. Inputs 0 
  3. Outputs 0 

【编辑推荐】

【责任编辑:赵宁宁 TEL:(010)68476606】
点赞 0
大家都在看猜你喜欢

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK