仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 873|回复: 7
打印 上一主题 下一主题

[shell编程] 来一发shell猎取工夫的相干下令

[复制链接]
山那边是海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-14 20:17:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的好朋友们!Linuxshell猎取工夫和工夫距离(ms级别)


申明:在举行一些功能测试的时分,偶然候我们但愿能盘算一个步伐运转的工夫,偶然候大概会本人写一个shell剧本便利举行一些功能测试的把持(好比但愿能运转N次取均匀值等),总之,这个中有一个需求大概就是猎取一个工夫戳或工夫差。


1.Linuxshell猎取工夫的相干下令
time下令:猎取一个步伐的实行工夫,能够猎取到实践运转工夫和步伐在用户态和内核态分离的工夫,年夜局部的功能测试,大概只必要存眷实践工夫。
time下令的利用就很复杂了,在原本的要运转的步伐(可实行文件、剧本等任何可实行步伐)之前加上time便可。
成绩一:time下令的经常使用选项
利用time,经常使用的选项是:-f和-p。个中-f前面指定一个格局串,把持time的输入的格局,默许的time输入是real、user、sys三行以xm***.***s的格局输入,经由过程-f能够把持。
-p选项也是格局,暗示利用posix尺度的格局,次要的区分是显现的工夫都是以s为单元的,详细关于格局的成绩参考mantime的匡助内容就晓得了。
PS:-f选项没法事情?弄不分明为什么-f和-o等选项都没法事情,晓得的请增补。(-p是事情的)
另外一种把持格局的***是设置TIMEFORMAT情况变量,详细参考mantime能够晓得这些格局把持符分离暗示甚么。举比方下:


[plain]viewplaincopyprint?
  1. #timepwd/home/sgeng2real0m0.000suser0m0.000ssys0m0.000s#exportTIMEFORMAT="realtime%E,usertime%U,systime%S"#timepwd/home/sgeng2realtime0.000,usertime0.000,systime0.000#time-ppwd/home/sgeng2real0.00user0.00sys0.00#
复制代码

  1. #timepwd/home/sgeng2real        0m0.000suser        0m0.000ssys        0m0.000s#exportTIMEFORMAT="realtime%E,usertime%U,systime%S"#timepwd/home/sgeng2realtime0.000,usertime0.000,systime0.000#time-ppwd/home/sgeng2real0.00user0.00sys0.00#
复制代码
PS:很奇异,感到time的有些格局和下面的选项一样,仿佛不完整事情,总之,干系不年夜,格局其实不主要,一样平常利用-p以秒作为单元就充足了。



成绩二:time下令的输入的成绩
下面已说到,仿佛-o选项其实不事情,那末,我们就只能本人想举措了。偶然候写剧本,就但愿把time的了局输入到文件中,然后大概会依据time的输入举行一些处置,好比提掏出real工夫等。明显,人人能想到的是重定向了,至于重定向的利用这里明显禁绝备会商(太庞大),只是提醒一点:time下令的输入了局是输入到stderr的,不是stdout,以是举行重定向的时分要注重了。看懂上面的例子基础就可以了解了:


[plain]viewplaincopyprint?


  1. #timepwd/home/sgeng2real0m0.000suser0m0.000ssys0m0.000s#timepwd>out.txtreal0m0.000suser0m0.000ssys0m0.000s#catout.txt/home/sgeng2#timepwd2>out.txt/home/sgeng2real0m0.000suser0m0.000ssys0m0.000s#catout.txt#(timepwd)2>out.txt/home/sgeng2#catout.txtreal0m0.000suser0m0.000ssys0m0.000s#(timepwd)>&out.txt#catout.txt/home/sgeng2real0m0.000suser0m0.000ssys0m0.000s#
复制代码

  1. #timepwd/home/sgeng2real        0m0.000suser        0m0.000ssys        0m0.000s#timepwd>out.txtreal        0m0.000suser        0m0.000ssys        0m0.000s#catout.txt/home/sgeng2#timepwd2>out.txt/home/sgeng2real        0m0.000suser        0m0.000ssys        0m0.000s#catout.txt#(timepwd)2>out.txt/home/sgeng2#catout.txtreal        0m0.000suser        0m0.000ssys        0m0.000s#(timepwd)>&out.txt#catout.txt/home/sgeng2real        0m0.000suser        0m0.000ssys        0m0.000s#
复制代码
PS:这里更多的是触及到的和重定向相干的内容,以是不会具体剖析每个例子。申明的是注重timepwd2>out.txt和(timepwd)2>out.txt的区分,后面一个的寄义是把pwd的了局stderr重定向到out.txt,相称于"time(pwd2>out.txt)"的了局。



date下令
关于date下令的利用,百度一把一年夜堆,就不反复了,比方能够参考:http://xingfujie.blog.51cto.com/2791569/637223
这里只申明一下几个罕见的成绩:
成绩一:date的%s和%N
date中有良多把持格局的,个中%s是猎取以后工夫间隔1970-01-0100:00:00UTC的工夫差。date的别的良多格局把持都是把持以后工夫的输入格局罢了,好比只输入时分秒,只输入年代日等等,个中%N也是这一类,%N输入的是以后工夫的纳秒局部,因为date并没有毫秒品级其余输入,以是在秒以下的内容都属于纳秒局部。以是从这个角度说,date是能够很准确的,能够到达纳秒级别。
成绩二:猎取一个工夫戳
偶然候会利用工夫戳,大概随机数,UUID如许的器材,百度一下也有相干文章(好比搜刮”shelldate随机数“等)。一样平常来讲,能够用%s和%N组合的体例就没成绩,统一秒内,两次运转%N一定不会一样,以是%s和%N组合能失掉一个独一数。


[plain]viewplaincopyprint?





  1. #date+%s.%N1337435374.969263560#date+%s+%N1337435377+310281496#date+%s_%N1337435381_209334510#date+%s_%N1337435383_169263078#date+%s_%N1337435383_830009679#
复制代码
PS:偶然候大概但愿用一个”独一“的器材来对文件定名等,就能够加上工夫戳了。



2.Linuxshell猎取工夫差(利用date下令)
至于利用time下令,其自己就是猎取一个工夫差,可是明显,time只合用于一些复杂的情形,由于前面的参数是能够实行的内容,偶然候大概必要实行多条下令,用time就对照贫苦。
(1)秒为单元
date猎取的是”以后工夫“,明显,两次运转date就能够失掉一个工夫差,实际上,可使用良多格局来暗示date的输入,从而盘算工夫差,可是,明显,最间接的体例就是利用%s了,如许间接就能够盘算出一个工夫差,不必要那末庞大的shell字符串处置了。以下:


[plain]viewplaincopyprint?


  • #start=$(date+%s)&&sleep2&&end=$(date+%s)&&echo$(($end-$start))
  • 2
  • #start=$(date+%s)&&sleep3&&end=$(date+%s)&&echo$(($end-$start))
  • 3
  • #
  1. #start=$(date+%s)&&sleep2&&end=$(date+%s)&&echo$(($end-$start))2#start=$(date+%s)&&sleep3&&end=$(date+%s)&&echo$(($end-$start))3#
复制代码
固然,这里是在terminal中测试的,以是用&&一连实行这些下令,关于剧本,一行一行的写就很好了。。。。



[plain]viewplaincopyprint?


  • start=$(date+%s)
  • ...whattodofortiming...
  • end=$(date+%s)
  • time=$(($end-$start))
  • echo$time
  1. start=$(date+%s)...whattodofortiming...end=$(date+%s)time=$(($end-$start))echo$time
复制代码


(2)ms为单元
更多的功能测试等场所猎取工夫差,有大概但愿准确到ms。现实上,利用date是能够到达ms的。间接上代码吧。


[plain]viewplaincopyprint?


  • #!/bin/bash
  • #filename:test.sh




  • #arg1=start,arg2=end,format:%s.%N
  • functiongetTiming(){
  • start=$1
  • end=$2


  • start_s=$(echo$start|cut-d.-f1)
  • start_ns=$(echo$start|cut-d.-f2)
  • end_s=$(echo$end|cut-d.-f1)
  • end_ns=$(echo$end|cut-d.-f2)




  • #fordebug..
  • #echo$start
  • #echo$end




  • time=$(((10#$end_s-10#$start_s)*1000+(10#$end_ns/1000000-10#$start_ns/1000000)))




  • echo"$timems"
  • }








  • echo"Thisisonlyatesttogetamsleveltimeduration..."
  • start=$(date+%s.%N)
  • ls>&/dev/null#hey,bequite,donotoutputtoconsole....
  • end=$(date+%s.%N)




  • getTiming$start$end
  1. #!/bin/bash#filename:test.sh#arg1=start,arg2=end,format:%s.%NfunctiongetTiming(){start=$1end=$2start_s=$(echo$start|cut-d.-f1)start_ns=$(echo$start|cut-d.-f2)end_s=$(echo$end|cut-d.-f1)end_ns=$(echo$end|cut-d.-f2)#fordebug..#echo$start#echo$endtime=$(((10#$end_s-10#$start_s)*1000+(10#$end_ns/1000000-10#$start_ns/1000000)))echo"$timems"}echo"Thisisonlyatesttogetamsleveltimeduration..."start=$(date+%s.%N)ls>&/dev/null#hey,bequite,donotoutputtoconsole....end=$(date+%s.%N)getTiming$start$end
复制代码
PS:这个代码是一个复杂的测试,能够猎取到ls下令实行的工夫,信任其实行工夫已够短了,假如你必要猎取的工夫差在ms以下,信任你不会利用shell了,嘿嘿,天然要靠C往弄了。

了局以下:


[html]viewplaincopyprint?


  • #./test.sh
  • Thisisonlyatesttogetamsleveltimeduration...
  • 3ms
  • #./test.sh
  • Thisisonlyatesttogetamsleveltimeduration...
  • 2ms
  • #./test.sh
  • Thisisonlyatesttogetamsleveltimeduration...
  • 2ms
  • #
  1. #./test.shThisisonlyatesttogetamsleveltimeduration...3ms#./test.shThisisonlyatesttogetamsleveltimeduration...2ms#./test.shThisisonlyatesttogetamsleveltimeduration...2ms#
复制代码

还中意吧,能猎取到这么短的工夫。固然,实际上能够猎取到以ns为单元的工夫差,可是,团体以为用shell往弄这么小的工夫差,你以为正确么。。。
申明:
下面的代码的思绪,实在很复杂了,%s为间隔尺度工夫的秒数,%N为以后工夫的秒以下的局部,那末明显,%s和%N就暗示了以后工夫的完全工夫戳,两个工夫戳就差值就是工夫差,成绩就是怎样处置的成绩,也许就是:先利用%s.%N的格局猎取到start和end工夫,然后使用cut下令从start和end中猎取到“.“后面的秒的局部和前面的纳秒的局部(申明:这里的在%s和%N之间拔出点,只是作为分开的感化,任何大概的字符都是能够的,只需能被cut分隔就行);然后,用秒的局部相减,失掉秒的差值,转换为毫秒的差值;然后,把纳秒的局部转换为毫秒以后求差值(大概为正数);最初,两个差值相加就是真实的以毫秒为单元的差值了。很简单了解,关头是cut的利用,关于shell妙手来讲,应当有良多***能够对字符串提取,可是关于我如许的非shell妙手,要本人用awk或sed甚么的写一个提取的正则,仍是很有难度,还好找到了cut下令,能很简单的对这类字符串举行提取。以是:这里的***仅供参考。。。
关于代码中的“10#”,这是暗示前面的数是10进制的数字,之以是必要这个是由于这里的纳秒的后面是以0开首的,shell中仿佛以0开首会默许以为是八进制,招致运转报错,总之,百度一下就找到了缘故原由,这里就干脆把一切的数字都加上了10#,暗示都是10进制。




如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的好朋友们!
小魔女 该用户已被删除
沙发
发表于 2015-1-15 16:56:03 | 只看该作者

来一发shell猎取工夫的相干下令

支持你哈...................................
莫相离 该用户已被删除
板凳
发表于 2015-1-25 19:05:11 | 只看该作者
一定要养成在命令行下工作的习惯,要知道X-window只是运行在命令行模式下的一个应用程序。在命令行下学习虽然一开始进度较慢。
柔情似水 该用户已被删除
地板
发表于 2015-2-4 04:48:02 | 只看该作者
发问的时候一定要注意到某些礼节。因为Linux社区是一个松散的组织、也不承担回复每个帖子的义务。它不是技术支持。
飘灵儿 该用户已被删除
5#
发表于 2015-2-9 16:16:28 | 只看该作者
众所周知,目前windows操作系统是主流,在以后相当长的时间内不会有太大的改变,其方便友好的图形界面吸引了众多的用户。
分手快乐 该用户已被删除
6#
发表于 2015-3-9 17:06:23 | 只看该作者
上课传授的不仅仅是知识,更重要的是一些道理,包括一些做人的道理,讲课时也抓住重点,循序渐进,让同学理解很快;更可贵的是不以你过去的成绩看问题.
飘飘悠悠 该用户已被删除
7#
发表于 2015-3-17 03:10:35 | 只看该作者
清楚了解网络的基础知识,特别是在Linux下应用知识,如接入internet等等。
不帅 该用户已被删除
8#
发表于 2015-3-23 22:10:36 | 只看该作者
我是学习嵌入式方向的,这学期就选修了这门专业任选课。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 13:36

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表