查看进程启动时间
2010年5月29日wangyuanzheng
Linux系统中通过ps命令查看进程状态,可以看到系统启动时间。但如果启动超过一天,它会变成问号。那如何获取这些进程的启动时间呢?
在Linux系统中,时间管理有两个基本概念:xtime和jiffies。
xtime主要给time系函数使用,结构比较简单(include\linux\time.h):
1 | structtimespec { |
2 | time_ttv_sec; /* seconds */ |
3 | longtv_nsec; /* nanoseconds,纳秒,以前的版本是微秒*/ |
4 | }; |
tv_sec就是大家平常所说的unix时间戳,在CMOS中维护,关机时由电池维持正常运行。
系统启动时,通过get_cmos_time()取cmos时间赋值。运行时,通过设置系统定时器,每隔一段时间触发一个节拍,他们管这个节拍叫tick。每触发一次tick,就会通过update_wall_time_one_tick()来更新xtime。
而jiffies是内核中的一个全局变量,它的功能看起来很简单:记录从系统启动以来的tick数。但它就是解开我们问题的关键。
在/proc/
最后得到的脚本如下:
01 | #!/bin/sh |
02 | functionshow_start_time( ) |
03 | { |
04 | pid=$1 |
05 | JIFFIES=`cat/proc/$pid/stat | cut-d" "-f22` |
06 | UPTIME=`grepbtime /proc/stat | cut-d" "-f2` |
07 | START_SEC=$(( $UPTIME + $JIFFIES / 100 )) |
08 | date-d "1970-01-01 UTC $START_SEC seconds" |
09 | } |
10 |
11 | if[ $# > 1 ] |
12 | then |
13 | forpid in$@; doshow_start_time ${#pid};done |
14 | fi |
15 |
16 | whilereadpid; doshow_start_time ${#pid}; done |
脚本中100是“用户可见”的tick频率(tick_rate),它的值等于我们熟悉的常量CLOCKS_PER_SEC。为什么要说“用户可见”呢?实际上,新版本的内核tick_rate,已经远高于100了(i386的是1000),但以前很多程序,都依赖于这个数。为了兼容,于是内核又做了一层封装。