【问题标题】:Golang retrieve application uptimeGolang 检索应用程序正常运行时间
【发布时间】:2016-10-25 20:22:54
【问题描述】:

我正在尝试检索我的 Go 应用程序的当前正常运行时间。

我看到有一个包 syscall 提供了一个 type Sysinfo_t 和一个方法 Sysinfo(*Sysinfo_t) 显然允许您检索正常运行时间(因为它是 Sysinfo_t 结构的字段)

到目前为止我所做的是:

sysi := &syscall.Sysinfo_t{}

if err := syscall.Sysinfo(sysi); err != nil {
    return http.StatusInternalServerError, nil
}

问题是在编译时我得到了这个:

/path/to/file/res_system.go:43: undefined: syscall.Sysinfo_t
/path/to/file/res_system.go:45: undefined: syscall.Sysinfo

我搜索了一下,显然该方法和类型仅在 Linux 上可用,我需要该应用程序在 Linux 和 OsX(我目前正在使用)上运行。

是否有一种交叉兼容的方式来检索应用程序的正常运行时间?

注意:我宁愿不使用任何第三方库(除非绝对必要)

【问题讨论】:

  • 为什么不直接使用计时器?
  • @eduncan911 老实说,在我看来,这似乎是一个相当繁重的解决方案,对吗?你想提供一个轻量级的例子吗?
  • 想法:一个微型库,它添加了一个像 net/http/pprof 这样的 HTTP 处理程序,确实公开了应用程序已启动的 (nano/milli) 秒数。
  • 一个轻量级的解决方案是在应用程序初始化时设置一个startTime time.Time,然后调用time.Now().Sub(startTime).Seconds()。困难的部分可能是在包之间传递startTime
  • 为什么这个问题被否决了?

标签: go cross-compiling system-calls uptime sysinfo


【解决方案1】:

获取正常运行时间的简单方法是存储服务开始时间:

https://play.golang.org/p/by_nkvhzqD

package main

import (
    "fmt"
    "time"
)

var startTime time.Time

func uptime() time.Duration {
    return time.Since(startTime)
}

func init() {
    startTime = time.Now()
}

func main() {
    fmt.Println("started")

    time.Sleep(time.Second * 1)
    fmt.Printf("uptime %s\n", uptime())

    time.Sleep(time.Second * 5)
    fmt.Printf("uptime %s\n", uptime())
}

【讨论】:

  • 我决定接受这个答案,因为您提供了完整的代码示例。感谢所有帮助 cmets 和答案的人!干杯!
  • 如果时钟发生变化,这可能是错误的......系统调用正常运行时间不受时钟变化的影响。
  • 不是真的@Gabriel。 Golang 的 time.Now() 既是单调的又是挂钟。因此,这个习惯用法可以抵抗时钟重置。 golang.org/pkg/time
  • 如果我需要在init 可以启动之前发生的库加载时间怎么办?
【解决方案2】:

您应该使用time 包中的Since 函数。

在应用启动时创建时间值:

startTime := time.Now()

然后随时询问:

uptime := time.Since(startTime)

【讨论】:

  • 我想我会采用这个解决方案,我认为我真的不喜欢在我的应用程序周围使用全局变量。明天(意大利时间)我会告诉你;)
【解决方案3】:

syscall 在 Go 1.4 上被冻结。

注意:此包已锁定。应迁移标准 Go 存储库之外的代码以使用 golang.org/x/sys 存储库中的相应包。这也是应该应用新系统或版本所需的更新的地方。有关更多信息,请参阅https://golang.org/s/go1.4-syscall

使用golang.org/x/sys 中的Sysinfo 它应该以跨平台的方式支持这一点,至少在 Unix 上是这样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多