// +build linux darwin package staros import ( "fmt" "io/ioutil" "os/user" "strconv" "strings" "syscall" "time" ) // StartTime 开机时间 func StartTime() time.Time { tmp, _ := readAsString("/proc/stat") data := splitBy(ReplaceByte9(tmp), " ") btime, _ := strconv.ParseInt(strings.TrimSpace(data["btime"]), 10, 64) return time.Unix(btime, 0) } // IsRoot 当前是否是管理员用户 func IsRoot() bool { uid, _ := user.Current() if uid.Uid == "0" { return true } return false } // Memory 系统内存信息 func Memory() MemStatus { var mem MemStatus ram := new(syscall.Sysinfo_t) if err := syscall.Sysinfo(ram); err != nil { return mem } mem.All = ram.Totalram mem.BuffCache = ram.Bufferram mem.Free = ram.Freeram mem.Shared = ram.Sharedram mem.Available = ram.Freeram + ram.Sharedram + ram.Bufferram mem.SwapAll = ram.Totalswap mem.SwapFree = ram.Freeswap mem.SwapUsed = mem.SwapAll - mem.SwapFree mem.Used = mem.All - mem.Free return mem } func Whoami() (uid, gid int, uname, gname, home string, err error) { var me *user.User var gup *user.Group me, err = user.Current() if err != nil { return } uid, _ = strconv.Atoi(me.Uid) gid, _ = strconv.Atoi(me.Uid) home = me.HomeDir uname = me.Username gup, err = user.LookupGroupId(me.Gid) if err != nil { return } gname = gup.Name return } func getCPUSample() (idle, total uint64) { contents, err := ioutil.ReadFile("/proc/stat") if err != nil { return } lines := strings.Split(string(contents), "\n") for _, line := range lines { fields := strings.Fields(line) if fields[0] == "cpu" { numFields := len(fields) for i := 1; i < numFields; i++ { val, err := strconv.ParseUint(fields[i], 10, 64) if err != nil { fmt.Println("Error: ", i, fields[i], err) } total += val // tally up all the numbers to get total ticks if i == 4 { // idle is the 5th field in the cpu line idle = val } } return } } return } // CpuUsage 获取CPU使用量 func CpuUsage(sleep time.Duration) float64 { idle0, total0 := getCPUSample() time.Sleep(sleep) idle1, total1 := getCPUSample() idleTicks := float64(idle1 - idle0) totalTicks := float64(total1 - total0) cpuUsage := 100 * (totalTicks - idleTicks) / totalTicks return cpuUsage //fmt.Printf("CPU usage is %f%% [busy: %f, total: %f]\n", cpuUsage, totalTicks-idleTicks, totalTicks) } func DiskUsage(path string) (disk DiskStatus) { fs := syscall.Statfs_t{} err := syscall.Statfs(path, &fs) if err != nil { return } disk.All = fs.Blocks * uint64(fs.Bsize) disk.Free = fs.Bfree * uint64(fs.Bsize) disk.Available = fs.Bavail * uint64(fs.Bsize) disk.Used = disk.All - disk.Free return }