Files
havline-native/app-src/internal/sysinfo/sysinfo_linux.go
T

77 lines
1.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//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
}