Golang獲取系統(tǒng)信息的實現(xiàn)_第1頁
Golang獲取系統(tǒng)信息的實現(xiàn)_第2頁
Golang獲取系統(tǒng)信息的實現(xiàn)_第3頁
Golang獲取系統(tǒng)信息的實現(xiàn)_第4頁
Golang獲取系統(tǒng)信息的實現(xiàn)_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論