我正在编写一个作为守护进程运行的跨平台Go应用程序。它基本上监听文件系统的更改以及对服务器的复制/下载更改。这个想法是它永远不应该减慢机器的速度,排队任务直到机器空闲。
为此,我想监控CPU,RAM和网络使用情况,但监控网络使用情况(如果可能)。我目前的目标是Windows 7 +,Mac OS 10+和Linux 3 +。
我主要是Linux程序员,所以我不熟悉Windows / BSD API,但我已经找到了一些关于BSD的好信息,所以我想我能搞清楚。我在跟踪Windows系统调用时遇到问题(我不知道如何获取Windows手册页......)。我已经设法找到这些资源(对于Windows):
我更喜欢使用系统调用而不是shell / out包装C ++ API。显然,我会对已经这样做的任何其他Go库感兴趣。
最终,我正在寻找这样的事情:http://nodejs.org/api/os.html
我非常关注系统调用以及如何使用它们的示例。
如果我朝错误的方向前进,请告诉我。我没有结合轮询内核获取系统信息的想法,但在我看来,这是获取该信息的最可靠方法。我更喜欢以弱势用户身份运行该应用程序。
答案 0 :(得分:3)
我找到了https://github.com/AllenDang/w32,这是一个为许多Windows API调用提供包装器的项目。我添加了对GetSystemTimes in my fork的调用,这就是我目前正在使用的内容。我已经打开了拉取请求,所以它应该很快合并。
这允许我获取CPU信息(空闲,内核和用户的时间,类似于/proc/stats
),并且它似乎工作得很好。这是一些示例代码:
package main
import (
"w32"
"fmt"
"time"
)
func main() {
var idle, kernel, user w32.FILETIME
w32.GetSystemTimes(&idle, &kernel, &user)
idleFirst := idle.DwLowDateTime | (idle.DwHighDateTime << 32)
kernelFirst := kernel.DwLowDateTime | (kernel.DwHighDateTime << 32)
userFirst := user.DwLowDateTime | (user.DwHighDateTime << 32)
time.Sleep(time.Second)
w32.GetSystemTimes(&idle, &kernel, &user)
idleSecond := idle.DwLowDateTime | (idle.DwHighDateTime << 32)
kernelSecond := kernel.DwLowDateTime | (kernel.DwHighDateTime << 32)
userSecond := user.DwLowDateTime | (user.DwHighDateTime << 32)
totalIdle := float64(idleSecond - idleFirst)
totalKernel := float64(kernelSecond - kernelFirst)
totalUser := float64(userSecond - userFirst)
totalSys := float64(totalKernel + totalUser)
fmt.Printf("Idle: %f%%\nKernel: %f%%\nUser: %f%%\n", (totalIdle / totalSys) * 100, (totalKernel / totalSys) * 100, (totalUser / totalSys) * 100)
fmt.Printf("\nTotal: %f%%\n", (totalSys - totalIdle) * 100 / totalSys)
}
如果我能找到RAM /网络统计数据,我应该设置。