Files

77 lines
1.6 KiB
Go
Raw Permalink Normal View History

//go:build linux
package sysinfo
import (
"os"
"strconv"
"strings"
"syscall"
)
func readPlatform() (Stats, CPUSample) {
var (
stats Stats
sample CPUSample
)
if raw, err := os.ReadFile("/proc/stat"); err == nil {
sample = parseProcStat(string(raw))
}
if raw, err := os.ReadFile("/proc/meminfo"); err == nil {
stats.MemTotalBytes, stats.MemUsedBytes = parseMemInfo(string(raw))
}
stats.DiskTotalBytes, stats.DiskUsedBytes = diskUsage("/")
return stats, sample
}
// LoadAvg 返回 1 / 5 / 15 分钟平均负载;读取失败返回 nil
func LoadAvg() []float64 {
raw, err := os.ReadFile("/proc/loadavg")
if err != nil {
return nil
}
fields := strings.Fields(string(raw))
if len(fields) < 3 {
return nil
}
values := make([]float64, 0, 3)
for _, field := range fields[:3] {
value, err := strconv.ParseFloat(field, 64)
if err != nil {
return nil
}
values = append(values, value)
}
return values
}
// UptimeSeconds 返回系统运行秒数(/proc/uptime)
func UptimeSeconds() uint64 {
raw, err := os.ReadFile("/proc/uptime")
if err != nil {
return 0
}
fields := strings.Fields(string(raw))
if len(fields) == 0 {
return 0
}
seconds, err := strconv.ParseFloat(fields[0], 64)
if err != nil || seconds < 0 {
return 0
}
return uint64(seconds)
}
func diskUsage(path string) (total, used uint64) {
var stat syscall.Statfs_t
if err := syscall.Statfs(path, &stat); err != nil {
return 0, 0
}
total = stat.Blocks * uint64(stat.Bsize)
free := stat.Bavail * uint64(stat.Bsize)
if free > total {
return total, 0
}
return total, total - free
}