1.使用ps顯示的進程運行後到如今通過的時間進行計算(Via)
Script by ihipop html
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"
|
2.經過procfs裏面的jiffies時間計算(Via) linux
在Linux系統中,時間管理有兩個基本概念:xtime和jiffies。 shell
xtime主要給time系函數使用,結構比較簡單(include\linux\time.h): bash
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。 spa
而jiffies是內核中的一個全局變量,它的功能看起來很簡單:記錄從系統啓動以來的tick數。
在/proc/ /stat中( 源碼請參考proc_pid_stat(),文件是fs/proc/array.c ),維護了進程的不少狀態信息,其中第22項是進程啓動時的jiffies值,經過它能夠計算出進程啓動時,系統已經開機的時間。把這個時間加上系統啓動時間(/proc/stat),就能夠獲得進程啓動時間。 unix
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),但之前不少程序,都依賴於這個數。爲了兼容,因而內核又作了一層封裝。 htm
3. shell blog
ps -p <pid> -o lstart 進程