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 17 deletions

View File

@ -9,7 +9,7 @@ import (
"runtime"
"strconv"
"strings"
"sync"
"time"
)
// SysInfo will record cpu and memory data
@ -27,6 +27,8 @@ type Stat struct {
start float64
rss float64
uptime float64
kernelmodetime float64
usermodetime float64
}
type fn func(int) (*SysInfo, error)
@ -34,7 +36,6 @@ type fn func(int) (*SysInfo, error)
var fnMap map[string]fn
var platform string
var history map[int]Stat
var historyLock sync.Mutex
var eol string
func wrapper(statType string) func(pid int) (*SysInfo, error) {
@ -44,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")
@ -57,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]
@ -141,18 +143,53 @@ func stat(pid int, statType string) (*SysInfo, error) {
seconds = 1
}
historyLock.Lock()
history[pid] = *stat
historyLock.Unlock()
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
}