1.使用ps显示的进程运行后到现在经过的时间进行计算(Via)
Script by ihipop
1
2
3
4
5
6
7
8
9
10
11
12
|
#!/bin/bash
pid
=
$
1
elt
=
$
(
ps
w
-
p
$pid
o
pid
=
,
cmd
=
,
etime
=
|
awk
'{print $NF}'
)
case
$
(
echo
$elt
|
sed
-
e
's/:/:\n/g'
|
grep
":"
-
c
)
in
"1"
)
elt
=
$
(
echo
$elt
|
sed
-
e
's/:/ minutes ago /'
)
;
;
*
)
elt
=
$
(
echo
$elt
|
sed
-
e
's/-/ days ago /'
-
e
's/:/ hours ago /'
-
e
's/:/ minutes ago /'
)
;
;
esac
date
-
d
"$elt seconds ago"
|
在Linux系统中,时间管理有两个基本概念:xtime和jiffies。
xtime主要给time系函数使用,结构比较简单(include\linux\time.h):
1234 struct timespec {time_t tv_sec ; /* seconds */long tv_nsec ; /* nanoseconds, 纳秒,以前的版本是微秒*/} ;tv_sec就是大家平常所说的unix时间戳,在CMOS中维护,关机时由电池维持正常运行。
系统启动时,通过get_cmos_time()取cmos时间赋值。运行时,通过设置系统定时器,每隔一段时间触发一个节拍,他们管这个节拍叫tick。每触发一次tick,就会通过update_wall_time_one_tick()来更新xtime。
而jiffies是内核中的一个全局变量,它的功能看起来很简单:记录从系统启动以来的tick数。
在/proc/ /stat中( 源码请参考proc_pid_stat(),文件是fs/proc/array.c ),维护了进程的很多状态信息,其中第22项是进程启动时的jiffies值,通过它可以计算出进程启动时,系统已经开机的时间。把这个时间加上系统启动时间(/proc/stat),就可以得到进程启动时间。
1
2
3
4
5
6
7
8
9
|
#!/bin/sh
function
show_start_time
(
)
{
pid
=
$
1
JIFFIES
=
`
cat
/
proc
/
$pid
/
stat
|
cut
-
d
" "
-
f22
`
UPTIME
=
`
grep
btime
/
proc
/
stat
|
cut
-
d
" "
-
f2
`
START_SEC
=
$
(
(
$UPTIME
+
$JIFFIES
/
$
(
getconf
CLK_TCK
)
)
)
date
-
d
"1970-01-01 UTC $START_SEC seconds"
}
|
脚本中100是“用户可见”的tick频率(tick_rate),它的值等于我们熟悉的常量CLOCKS_PER_SEC。为什么要说“用户可见”呢?实际上,新版本的内核tick_rate,已经远高于100了(i386的是1000),但以前很多程序,都依赖于这个数。为了兼容,于是内核又做了一层封装。
3. shell
ps -p <pid> -o lstart