2026-09-23 19:10:43 +08:00
|
|
|
|
//go:build linux
|
|
|
|
|
|
|
|
|
|
|
|
package sysinfo
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"os"
|
2026-09-24 10:15:11 +08:00
|
|
|
|
"strconv"
|
|
|
|
|
|
"strings"
|
2026-09-23 19:10:43 +08:00
|
|
|
|
"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
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-09-24 10:15:11 +08:00
|
|
|
|
// 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)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-09-23 19:10:43 +08:00
|
|
|
|
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
|
|
|
|
|
|
}
|