Linux下獲取進程的啓動時間的幾種方法

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

1
2
3
4
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 進程

相關文章
相關標籤/搜索