1. 程式人生 > 其它 >go語言 獲得程序啟動時間的兩種方法

go語言 獲得程序啟動時間的兩種方法

自己在看別人程式碼的時候發現了兩種不同的獲得linux程序啟動時間的方法,現在記錄下來,方便以後檢視。

方法一:根據進行的pid,獲得程序相關的資料夾,/proc/pid。將這個資料夾被修改的時間作為程序的啟動時間。這樣獲取的程序啟動時間不一定是準確的,但是相比方法二,花費的時間少。

var stat os.FileInfo
if stat, err = os.Lstat(fmt.Sprintf("/proc/%v", pid)); err != nil {
return nil
}
proc.mtime = stat.ModTime().Unix()

方法二:根據程序相關的檔案/proc/pid/stat中的內容獲得程序啟動時距離系統啟動時的時間間隔,根據間隔計算出程序的啟動時間。這種方法獲得的時間更準確,但是效能可能比方法一差。

var (
Uptime int64 // 系統啟動時間戳
scClkTck = int64(C.sysconf(C._SC_CLK_TCK))
)

func init() {
sys := syscall.Sysinfo_t{}
syscall.Sysinfo(&sys)
Uptime = time.Now().Unix() - sys.Uptime
}

func ProcessStartTime(pid int) (ts time.Time) {
buf, err := ioutil.ReadFile(fmt.Sprintf("/proc/%v/stat", pid))
if err != nil {
return time.Unix(0, 0)
}
if fields := strings.Fields(string(buf)); len(fields) > 22 {
start, err := strconv.ParseInt(fields[21], 10, 0)
if err == nil {
if scClkTck > 0 {
return time.Unix(Uptime+(start/scClkTck), 0)
}
return time.Unix(Uptime+(start/100), 0)
}
}
return time.Unix(0, 0)
}

博主簡介:博主國內安全行業目前最強大的網路安全公司做技術研究員,常年做技術工作。 獲得過以下全國競賽大獎: 《中國電子作品大賽一等獎》 《雲端計算技術大賽一等獎》 《AIIA人工智慧大賽優勝獎》《網路安全知識競賽一等獎》 《高新技術個人突出貢獻獎》,並參與《虛擬化技術-**保密**》一書編寫,現已出版。還擁有多項專利,多項軟體著作權! 且學習狀態上進,立志做技術牛逼的人。座右銘:在路上,永遠年輕,永遠熱淚盈眶。可郵件聯絡博主共同進步,個人郵箱:[email protected]