版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第Golang獲取系統(tǒng)信息的實現(xiàn)目錄問題提出golang的編譯選項獲取系統(tǒng)信息本文介紹獲取系統(tǒng)信息的方法,另外給出根據(jù)不同系統(tǒng)編譯的方法。
問題提出
由于多年來接觸了不同系統(tǒng)的兼容工程,對使用宏區(qū)分不同的代碼一直有一種莫名的感覺。像Linux內(nèi)核中就有很多這樣的代碼,coreboot中有,nRF52SDK中也有。在實現(xiàn)的工程庫也要往這方向考慮,比如線程庫和socket庫。當(dāng)接觸golang后,因其跨平臺,編碼快,所以在工作中也使用了。但并不是所有代碼都是跨平臺,像syscall這樣的包,就無法做到。最近的工程中需要獲取系統(tǒng)信息,但無法只使用golang官方的接口達(dá)到目的,最終找到了第三方庫/shirou/gopsutil。
在找到第三方庫前,也想過根據(jù)不同的系統(tǒng)編譯不同的源碼文件,經(jīng)過考量,還是直接用現(xiàn)成的庫。
golang的編譯選項
在進(jìn)入主題前,先了解一下編譯選項。C++可以直接在文件開始和結(jié)束處分別加#if0和#endif解決,相應(yīng)的,golang可以在.go文件定義包前添加//+buildwindows或//+buildlinux來區(qū)別在哪個系統(tǒng)編譯。
如果后面跟著注釋,會提示//go:buildcommentwithout//+buildcomment。
另一種方法,是直接使用源碼文件名稱來區(qū)分。比如ccall_linux.go和ccall_windows.go分別在Linux系統(tǒng)和Windows系統(tǒng)下編譯,這種方法非常直觀。golang中帶_test的文件是測試用例,這其中的設(shè)計思想是一致的。
實際中,筆者使用的工程會調(diào)用Linux的動態(tài)庫,但在編譯調(diào)試時,還是以Windows為主,因為涉及web前端的設(shè)計,這樣就可以在Windows中不調(diào)用動態(tài)庫,即接口函數(shù)做空實現(xiàn)。
獲取系統(tǒng)信息
gopsutil抽象了不同系統(tǒng),提供統(tǒng)一接口,因為不存在上述問題,本節(jié)給出一些示例代碼,可以獲取一些必要的系統(tǒng)信息,如CPU、內(nèi)存、磁盤等。
packagegin
import(
"fmt"
"os"
"runtime"
"time"
"/shirou/gopsutil/cpu"
"/shirou/gopsutil/disk"
"/shirou/gopsutil/host"
"/shirou/gopsutil/net"
"/shirou/gopsutil/v3/mem"
typeLSysInfostruct{
MemAll
uint64
MemFree
uint64
MemUsed
uint64
MemUsedPercentfloat64
Days
int64
Hours
int64
Minutes
int64
Seconds
int64
CpuUsedPercentfloat64
OS
string
Arch
string
CpuCores
int
funcGetSysInfo()(infoLSysInfo){
unit:=uint64(1024*1024)//MB
v,_:=mem.VirtualMemory()
info.MemAll=v.Total
info.MemFree=v.Free
info.MemUsed=info.MemAll-info.MemFree
//注:使用SwapMemory或VirtualMemory,在不同系統(tǒng)中使用率不一樣,因此直接計算一次
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內(nèi)的CPU信息,太短不準(zhǔn)確,也可以獲幾秒內(nèi)的,但這樣會有延時,因為要等待
cc,_:=cpu.Percent(time.Millisecond*200,false)
info.CpuUsedPercent=cc[0]
//獲取開機(jī)時間
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:%#v\n",info)
infoTest()
os.Exit(0)
return
funcinfoTest(){
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)
iflen(c)1{
for_,sub_cpu:=rangec{
modelname:=sub_cpu.ModelName
cores:=sub_cpu.Cores
fmt.Printf("CPUs:%v
%vcores\n",modelname,cores)
}
}else{
sub_cpu:=c[0]
modelname:=sub_cpu.ModelName
cores:=sub_cpu.Cores
fmt.Printf("CPU:%v
%vcores\n",modelname,cores)
}
fmt.Printf("physicalcount:%dlogicalcount:%d\n",physicalCnt,logicalCnt)
fmt.Printf("CPUUsed:used%f%%\n",cc[0])
fmt.Printf("HD:%vGBFree:%vGBUsage:%f%%\n",d.Total/1024/1024/1024,d.Free/1024/1024/1024,d.UsedPercent)
fmt.Printf("OS:%v(%v)%v\n",n.Platform,n.PlatformFamily,n.PlatformVersion)
fmt.Printf("Hostname:%v\n",n.Hostname)
fmt.Printf("Network:%vbytes/%vbytes\n",nv[0].BytesRecv,nv[0].BytesSent)
}
需要注意的,計算內(nèi)存的使用率,是根據(jù)已獲取的已用內(nèi)存除以總內(nèi)存,而不是直接由gopsutil獲取。計算CPU使用率,需要指定時間間隔,如果秒級別,用戶會感覺卡頓,文中代碼使用200毫秒,經(jīng)測試,有時獲取的值為0。至于運行時間,則通過時間戳直接計算出天數(shù)。
某windows系統(tǒng)運行結(jié)果如下:
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-4210MCPU@2.60GHz4cores
physicalcount:2logicalcount:4
CPUUsed:used8.593750%
HD:330GBFree:32GBUsage:90.242198%
OS:MicrosoftWindows7UltimateServicePack1(StandaloneWorkstation)6.1.7601Build7601
Hostname:SKY-20250126BVC
Network:0bytes/0bytes
某linux服務(wù)器運行結(jié)果:
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)CPUE5-2640v4@2.40GHz1cores
CPUs:Intel(R)Xeon(R)CPUE5-
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 經(jīng)濟(jì)法計算題題目及答案
- 醫(yī)共體工作制度
- 集美疾控面試題目及答案
- 四心談話問答題目及答案
- 養(yǎng)老院老人心理咨詢師晉升制度
- 養(yǎng)老院老人入住簽字制度
- 養(yǎng)老院老人康復(fù)設(shè)施維修人員職業(yè)發(fā)展規(guī)劃制度
- 幼教繪畫面試題目及答案
- 養(yǎng)老院老年人活動組織制度
- 大人的思考題目及答案
- GB/T 31831-2025LED室內(nèi)照明應(yīng)用技術(shù)要求
- 2025年上交所金融筆試題目及答案
- 服務(wù)外包人員保密管理制度(3篇)
- 2026中國電信四川公用信息產(chǎn)業(yè)有限責(zé)任公司社會成熟人才招聘備考題庫及答案詳解(奪冠系列)
- 成都高新區(qū)桂溪街道公辦幼兒園招聘編外人員考試備考題庫及答案解析
- 2025年醫(yī)院病歷管理操作規(guī)范
- 汽車后市場培訓(xùn)課件
- 2026云南保山電力股份有限公司校園招聘50人筆試備考題庫及答案解析
- GB 4053.2-2025固定式金屬梯及平臺安全要求第2部分:斜梯
- 2026屆上海市長寧區(qū)市級名校高一上數(shù)學(xué)期末學(xué)業(yè)質(zhì)量監(jiān)測模擬試題含解析
- 2026年煙草公司筆試綜合試題及考點實操指引含答案
評論
0/150
提交評論