• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

go语言获得进程启动时间的两种方法

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

自己在看别人代码的时候发现了两种不同的获得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)
}


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Go语言的调度模型(GPM)发布时间:2022-07-10
下一篇:
go语言入门基础学习系列教程:第五节Go语言和其他语言的对比 ...发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap