Compare commits

...

3 Commits

Author SHA1 Message Date
strucoder 25b2fd121a feat(4windows): save data 2018-02-06 17:51:00 +08:00
strucoder 9927ebc77a feat(4windows): just for windows 2018-02-05 23:55:52 +08:00
strucoder 581934eda8 feat(4windows): just for windows 2018-02-05 23:37:37 +08:00
1 changed files with 54 additions and 13 deletions

View File

@ -9,6 +9,7 @@ import (
"runtime"
"strconv"
"strings"
"time"
)
// SysInfo will record cpu and memory data
@ -19,13 +20,15 @@ type SysInfo struct {
// Stat will store CPU time struct
type Stat struct {
utime float64
stime float64
cutime float64
cstime float64
start float64
rss float64
uptime float64
utime float64
stime float64
cutime float64
cstime float64
start float64
rss float64
uptime float64
kernelmodetime float64
usermodetime float64
}
type fn func(int) (*SysInfo, error)
@ -42,10 +45,10 @@ func wrapper(statType string) func(pid int) (*SysInfo, error) {
}
func init() {
platform = runtime.GOOS
if eol = "\n"; strings.Index(platform, "win") == 0 {
platform = "win"
eol = "\r\n"
}
// if eol = "\n"; strings.Index(platform, "win") == 0 {
// platform = "win"
// eol = "\r\n"
// }
history = make(map[int]Stat)
fnMap = make(map[string]fn)
fnMap["darwin"] = wrapper("ps")
@ -55,6 +58,7 @@ func init() {
fnMap["linux"] = wrapper("proc")
fnMap["netbsd"] = wrapper("proc")
fnMap["win"] = wrapper("win")
fnMap["windows"] = wrapper("windows")
}
func formatStdOut(stdout []byte, userfulIndex int) []string {
infoArr := strings.Split(string(stdout), eol)[userfulIndex]
@ -142,13 +146,50 @@ func stat(pid int, statType string) (*SysInfo, error) {
history[pid] = *stat
sysInfo.CPU = (total / seconds) * 100
sysInfo.Memory = stat.rss * pageSize
} else if statType == "windows" {
uptime := float64(time.Now().Unix())
args := "wmic PROCESS " + strconv.Itoa(pid) + " get workingsetsize,usermodetime,kernelmodetime"
cmdArgs := strings.Fields(args)
output, _ := exec.Command(cmdArgs[0], cmdArgs[1:len(cmdArgs)]...).Output()
outputStr := string(output)
strArr := strings.Fields(outputStr)[3:]
kernelmodetime := parseFloat(strArr[0])
usermodetime := parseFloat(strArr[1])
workingsetsize := parseFloat(strArr[2])
_kernelmodetime := 0.0
_usermodetime := 0.0
_uptime := 0.0
if _history.kernelmodetime != 0 {
_kernelmodetime = _history.kernelmodetime
}
if _history.usermodetime != 0 {
_usermodetime = _history.usermodetime
}
if _history.uptime != 0 {
_uptime = _history.uptime
}
total := kernelmodetime - _kernelmodetime + usermodetime - _usermodetime
total = total / 10000000
// seconds :=
stat := &Stat{
kernelmodetime: kernelmodetime,
usermodetime: usermodetime,
uptime: uptime,
}
history[pid] = *stat
}
return sysInfo, nil
}
// GetStat will return current system CPU and memory data
func GetStat(pid int) (*SysInfo, error) {
sysInfo, err := fnMap[platform](pid)
sysInfo, err := fnMap[platform](12320)
return sysInfo, err
}