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)
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM