<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文介紹獲取系統資訊的方法,另外給出根據不同系統編譯的方法。
由於多年來接觸了不同系統的相容工程,對使用宏區分不同的程式碼一直有一種莫名的感覺。像 Linux 核心中就有很多這樣的程式碼,coreboot 中有,nRF52 SDK中也有。在實現的工程庫也要往這方向考慮,比如執行緒庫和socket庫。當接觸 golang 後,因其跨平臺,編碼快,所以在工作中也使用了。但並不是所有程式碼都是跨平臺,像 syscall這樣的包,就無法做到。最近的工程中需要獲取系統資訊,但無法只使用 golang 官方的介面達到目的,最終找到了第三方庫github.com/shirou/gopsutil
。
在找到第三方庫前,也想過根據不同的系統編譯不同的原始碼檔案,經過考量,還是直接用現成的庫。
在進入主題前,先了解一下編譯選項。C++可以直接在檔案開始和結束處分別加#if 0和#endif解決,相應的,golang 可以在.go檔案定義包前新增// +build windows或// +build linux來區別在哪個系統編譯。
如果後面跟著註釋,會提示//go:build comment without // +build comment
。
另一種方法,是直接使用原始碼檔名稱來區分。比如ccall_linux.go和ccall_windows.go分別在 Linux 系統和 Windows 系統下編譯,這種方法非常直觀。golang 中帶_test的檔案是測試用例,這其中的設計思想是一致的。
實際中,筆者使用的工程會呼叫 Linux 的動態庫,但在編譯偵錯時,還是以 Windows 為主,因為涉及 web 前端的設計,這樣就可以在 Windows 中不呼叫動態庫,即介面函數做空實現。
gopsutil 抽象了不同系統,提供統一介面,因為不存在上述問題,本節給出一些範例程式碼,可以獲取一些必要的系統資訊,如CPU、記憶體、磁碟等。
package gin import ( "fmt" "os" "runtime" "time" "github.com/shirou/gopsutil/cpu" "github.com/shirou/gopsutil/disk" "github.com/shirou/gopsutil/host" "github.com/shirou/gopsutil/net" "github.com/shirou/gopsutil/v3/mem" ) type LSysInfo struct { MemAll uint64 MemFree uint64 MemUsed uint64 MemUsedPercent float64 Days int64 Hours int64 Minutes int64 Seconds int64 CpuUsedPercent float64 OS string Arch string CpuCores int } func GetSysInfo() (info LSysInfo) { unit := uint64(1024 * 1024) // MB v, _ := mem.VirtualMemory() info.MemAll = v.Total info.MemFree = v.Free info.MemUsed = info.MemAll - info.MemFree // 注:使用SwapMemory或VirtualMemory,在不同系統中使用率不一樣,因此直接計算一次 info.MemUsedPercent = float64(info.MemUsed) / float64(info.MemAll) * 100.0 // v.UsedPercent info.MemAll /= unit info.MemUsed /= unit info.MemFree /= unit info.OS = runtime.GOOS info.Arch = runtime.GOARCH info.CpuCores = runtime.GOMAXPROCS(0) // 獲取200ms內的CPU資訊,太短不準確,也可以獲幾秒內的,但這樣會有延時,因為要等待 cc, _ := cpu.Percent(time.Millisecond*200, false) info.CpuUsedPercent = cc[0] // 獲取開機時間 boottime, _ := host.BootTime() ntime := time.Now().Unix() btime := time.Unix(int64(boottime), 0).Unix() deltatime := ntime - btime info.Seconds = int64(deltatime) info.Minutes = info.Seconds / 60 info.Seconds -= info.Minutes * 60 info.Hours = info.Minutes / 60 info.Minutes -= info.Hours * 60 info.Days = info.Hours / 24 info.Hours -= info.Days * 24 fmt.Printf("info: %#vn", info) infoTest() os.Exit(0) return } func infoTest() { c, _ := cpu.Info() cc, _ := cpu.Percent(time.Second, false) // 1秒 d, _ := disk.Usage("/") n, _ := host.Info() nv, _ := net.IOCounters(true) physicalCnt, _ := cpu.Counts(false) logicalCnt, _ := cpu.Counts(true) if len(c) > 1 { for _, sub_cpu := range c { modelname := sub_cpu.ModelName cores := sub_cpu.Cores fmt.Printf("CPUs: %v %v cores n", modelname, cores) } } else { sub_cpu := c[0] modelname := sub_cpu.ModelName cores := sub_cpu.Cores fmt.Printf("CPU: %v %v cores n", modelname, cores) } fmt.Printf("physical count:%d logical count:%dn", physicalCnt, logicalCnt) fmt.Printf("CPU Used: used %f%%n", cc[0]) fmt.Printf("HD: %v GB Free: %v GB Usage:%f%%n", d.Total/1024/1024/1024, d.Free/1024/1024/1024, d.UsedPercent) fmt.Printf("OS: %v(%v) %vn", n.Platform, n.PlatformFamily, n.PlatformVersion) fmt.Printf("Hostname: %vn", n.Hostname) fmt.Printf("Network: %v bytes / %v bytesn", nv[0].BytesRecv, nv[0].BytesSent) }
需要注意的,計算記憶體的使用率,是根據已獲取的已用記憶體除以總記憶體,而不是直接由gopsutil獲取。計算CPU使用率,需要指定時間間隔,如果秒級別,使用者會感覺卡頓,文中程式碼使用 200 毫秒,經測試,有時獲取的值為0。至於執行時間,則通過時間戳直接計算出天數。
某windows系統執行結果如下:
info: gin.LSysInfo{MemAll:0x2ec6, MemFree:0x11a5, MemUsed:0x1d21, MemUsedPercent:62.27692697126946, Days:0, Hours:9, Minutes:26, Seconds:6, CpuUsedPercent:5.882352941068881, OS:"windows", Arch:"amd64", CpuCores:4}
CPU: Intel(R) Core(TM) i5-4210M CPU @ 2.60GHz 4 cores
physical count:2 logical count:4
CPU Used: used 8.593750%
HD: 330 GB Free: 32 GB Usage:90.242198%
OS: Microsoft Windows 7 Ultimate Service Pack 1(Standalone Workstation) 6.1.7601 Build 7601
Hostname: SKY-20210126BVC
Network: 0 bytes / 0 bytes
某 linux 伺服器執行結果:
info: gin.LSysInfo{MemAll:0xf84b, MemFree:0x527, MemUsed:0xf323, MemUsedPercent:97.92430801663596, Days:0, Hours:1, Minutes:6, Seconds:38, CpuUsedPercent:0.25062656021506197, OS:"linux", Arch:"amd64", CpuCores:20}
CPUs: Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz 1 cores
CPUs: Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz 1 cores
...
physical count:10 logical count:20
CPU Used: used 0.702459%
HD: 49 GB Free: 38 GB Usage:16.708842%
OS: centos(rhel) 7.6.000
Hostname: localhost.localdomain
Network: 1915935 bytes / 224926648 bytes
到此這篇關於Golang 獲取系統資訊的實現的文章就介紹到這了,更多相關Golang 獲取系統資訊內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45