zoukankan      html  css  js  c++  java
  • 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人工智能大赛优胜奖》《网络安全知识竞赛一等奖》 《高新技术个人突出贡献奖》,并参与《虚拟化技术-**保密**》一书编写,现已出版。还拥有多项专利,多项软件著作权! 且学习状态上进,立志做技术牛逼的人。座右铭:在路上,永远年轻,永远热泪盈眶。可邮件联系博主共同进步,个人邮箱:pigeon_code@163.com
  • 相关阅读:
    第七节:详细讲解Java中的日期,java.util.date
    第六节:详细讲解Java中的装箱与拆箱及其字符串
    第五节:详细讲解Java中的接口与继承
    第四节:详细讲解Java中的类和面向对象思想
    第三节:带你详解Java的操作符,控制流程以及数组
    第二节:Java入门第一行代码
    第一节:学会Java前提-手把手教你配置JDK环境变量
    Android精通之Handler讲解
    Android精通之AsyncTask与ListView讲解
    Android精通之AsyncTask与ListView讲解
  • 原文地址:https://www.cnblogs.com/mutudou/p/15458165.html
Copyright © 2011-2022 走看看