我正在编写一个作为守护进程运行的跨平台的Go应用程序。 它基本上监听文件系统上的更改,并从服务器复制/下载更改。 这个想法是,它永远不应该放慢机器,排队等待机器空闲。
要做到这一点,我想监视CPU,RAM和networking使用情况,但networking使用情况(如果可能的话)。 我目前的目标是Windows 7 +,Mac OS 10+和Linux 3+。
我主要是Linux程序员,所以我不熟悉Windows / BSD API,但是我已经发现了一些关于BSD的好消息,所以我想我可以弄清楚。 我无法跟踪Windows系统调用(我不知道如何获得Windows手册页…)。 我已经设法find这些资源(对于Windows):
我宁愿使用系统调用,而不是使用/封装C ++ API。 很显然,我会对其他已经这样做的Go库感兴趣。
最终,我正在寻找这样的东西: http : //nodejs.org/api/os.html
我几乎在寻找系统调用和如何使用它们的例子。
如果我走错了方向,请告诉我。 我并不想为系统信息轮询内核,但在我看来,这是获得这些信息的最可靠的方法。 我宁愿运行该应用程序作为一个贫困的用户。
我找到了https://github.com/AllenDang/w32 ,这个项目为很多Windows API调用提供了包装。 我在fork中添加了对GetSystemTimes的调用,这就是我目前使用的。 我已经打开了一个拉请求,所以它应该尽快合并。
这使我得到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) totalcoreel := float64(kernelSecond - kernelFirst) totalUser := float64(userSecond - userFirst) totalSys := float64(totalcoreel + totalUser) fmt.Printf("Idle: %f%%\ncoreel: %f%%\nUser: %f%%\n", (totalIdle / totalSys) * 100, (totalcoreel / totalSys) * 100, (totalUser / totalSys) * 100) fmt.Printf("\nTotal: %f%%\n", (totalSys - totalIdle) * 100 / totalSys) }
如果我能找到RAM /网络统计,我应该设置。