2020-09-01 10:34:11 +08:00
|
|
|
|
package machine
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
2021-01-08 15:37:32 +08:00
|
|
|
|
"mayfly-go/base/model"
|
2020-09-01 10:34:11 +08:00
|
|
|
|
"mayfly-go/base/utils"
|
|
|
|
|
|
"strconv"
|
|
|
|
|
|
"strings"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
type SystemVersion struct {
|
|
|
|
|
|
Version string
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-01-08 15:37:32 +08:00
|
|
|
|
func (c *Cli) GetSystemVersion() *SystemVersion {
|
|
|
|
|
|
res, _ := c.Run("cat /etc/redhat-release")
|
2020-09-01 10:34:11 +08:00
|
|
|
|
return &SystemVersion{
|
2021-01-08 15:37:32 +08:00
|
|
|
|
Version: *res,
|
2020-09-01 10:34:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//top - 17:14:07 up 5 days, 6:30, 2 users, load average: 0.03, 0.04, 0.05
|
|
|
|
|
|
//Tasks: 101 total, 1 running, 100 sleeping, 0 stopped, 0 zombie
|
|
|
|
|
|
//%Cpu(s): 6.2 us, 0.0 sy, 0.0 ni, 93.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
|
|
|
|
|
|
//KiB Mem : 1882012 total, 73892 free, 770360 used, 1037760 buff/cache
|
|
|
|
|
|
//KiB Swap: 0 total, 0 free, 0 used. 933492 avail Mem
|
|
|
|
|
|
type Top struct {
|
|
|
|
|
|
Time string `json:"time"`
|
|
|
|
|
|
// 从本次开机到现在经过的时间
|
|
|
|
|
|
Up string `json:"up"`
|
|
|
|
|
|
// 当前有几个用户登录到该机器
|
|
|
|
|
|
NowUsers int `json:"nowUsers"`
|
|
|
|
|
|
// load average: 0.03, 0.04, 0.05 (系统1分钟、5分钟、15分钟内的平均负载值)
|
|
|
|
|
|
OneMinLoadavg float32 `json:"oneMinLoadavg"`
|
|
|
|
|
|
FiveMinLoadavg float32 `json:"fiveMinLoadavg"`
|
|
|
|
|
|
FifteenMinLoadavg float32 `json:"fifteenMinLoadavg"`
|
|
|
|
|
|
// 进程总数
|
|
|
|
|
|
TotalTask int `json:"totalTask"`
|
|
|
|
|
|
// 正在运行的进程数,对应状态TASK_RUNNING
|
|
|
|
|
|
RunningTask int `json:"runningTask"`
|
|
|
|
|
|
SleepingTask int `json:"sleepingTask"`
|
|
|
|
|
|
StoppedTask int `json:"stoppedTask"`
|
|
|
|
|
|
ZombieTask int `json:"zombieTask"`
|
|
|
|
|
|
// 进程在用户空间(user)消耗的CPU时间占比,不包含调整过优先级的进程
|
|
|
|
|
|
CpuUs float32 `json:"cpuUs"`
|
|
|
|
|
|
// 进程在内核空间(system)消耗的CPU时间占比
|
|
|
|
|
|
CpuSy float32 `json:"cpuSy"`
|
|
|
|
|
|
// 调整过用户态优先级的(niced)进程的CPU时间占比
|
|
|
|
|
|
CpuNi float32 `json:"cpuNi"`
|
|
|
|
|
|
// 空闲的(idle)CPU时间占比
|
|
|
|
|
|
CpuId float32 `json:"cpuId"`
|
|
|
|
|
|
// 等待(wait)I/O完成的CPU时间占比
|
|
|
|
|
|
CpuWa float32 `json:"cpuWa"`
|
|
|
|
|
|
// 处理硬中断(hardware interrupt)的CPU时间占比
|
|
|
|
|
|
CpuHi float32 `json:"cpuHi"`
|
|
|
|
|
|
// 处理硬中断(hardware interrupt)的CPU时间占比
|
|
|
|
|
|
CpuSi float32 `json:"cpuSi"`
|
|
|
|
|
|
// 当Linux系统是在虚拟机中运行时,等待CPU资源的时间(steal time)占比
|
|
|
|
|
|
CpuSt float32 `json:"cpuSt"`
|
|
|
|
|
|
|
|
|
|
|
|
TotalMem int `json:"totalMem"`
|
|
|
|
|
|
FreeMem int `json:"freeMem"`
|
|
|
|
|
|
UsedMem int `json:"usedMem"`
|
|
|
|
|
|
CacheMem int `json:"cacheMem"`
|
|
|
|
|
|
|
|
|
|
|
|
TotalSwap int `json:"totalSwap"`
|
|
|
|
|
|
FreeSwap int `json:"freeSwap"`
|
|
|
|
|
|
UsedSwap int `json:"usedSwap"`
|
|
|
|
|
|
AvailMem int `json:"availMem"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-01-08 15:37:32 +08:00
|
|
|
|
func (c *Cli) GetTop() *Top {
|
|
|
|
|
|
res, _ := c.Run("top -b -n 1 | head -5")
|
2020-09-01 10:34:11 +08:00
|
|
|
|
topTemp := "top - {upAndUsers}, load average: {loadavg}\n" +
|
|
|
|
|
|
"Tasks:{totalTask} total,{runningTask} running,{sleepingTask} sleeping,{stoppedTask} stopped,{zombieTask} zombie\n" +
|
|
|
|
|
|
"%Cpu(s):{cpuUs} us,{cpuSy} sy,{cpuNi} ni,{cpuId} id,{cpuWa} wa,{cpuHi} hi,{cpuSi} si,{cpuSt} st\n" +
|
|
|
|
|
|
"KiB Mem :{totalMem} total,{freeMem} free,{usedMem} used,{cacheMem} buff/cache\n" +
|
|
|
|
|
|
"KiB Swap:{totalSwap} total,{freeSwap} free,{usedSwap} used. {availMem} avail Mem \n"
|
|
|
|
|
|
resMap := make(map[string]interface{})
|
2021-01-08 15:37:32 +08:00
|
|
|
|
utils.ReverStrTemplate(topTemp, *res, resMap)
|
2020-09-01 10:34:11 +08:00
|
|
|
|
|
|
|
|
|
|
//17:14:07 up 5 days, 6:30, 2
|
|
|
|
|
|
timeUpAndUserStr := resMap["upAndUsers"].(string)
|
|
|
|
|
|
timeUpAndUser := strings.Split(timeUpAndUserStr, "up")
|
|
|
|
|
|
time := utils.StrTrim(timeUpAndUser[0])
|
|
|
|
|
|
upAndUsers := strings.Split(timeUpAndUser[1], ",")
|
|
|
|
|
|
up := utils.StrTrim(upAndUsers[0]) + upAndUsers[1]
|
|
|
|
|
|
users, _ := strconv.Atoi(utils.StrTrim(strings.Split(utils.StrTrim(upAndUsers[2]), " ")[0]))
|
|
|
|
|
|
// 0.03, 0.04, 0.05
|
|
|
|
|
|
loadavgs := strings.Split(resMap["loadavg"].(string), ",")
|
|
|
|
|
|
oneMinLa, _ := strconv.ParseFloat(loadavgs[0], 32)
|
|
|
|
|
|
fiveMinLa, _ := strconv.ParseFloat(utils.StrTrim(loadavgs[1]), 32)
|
|
|
|
|
|
fifMinLa, _ := strconv.ParseFloat(utils.StrTrim(loadavgs[2]), 32)
|
|
|
|
|
|
|
|
|
|
|
|
top := &Top{Time: time, Up: up, NowUsers: users, OneMinLoadavg: float32(oneMinLa), FiveMinLoadavg: float32(fiveMinLa), FifteenMinLoadavg: float32(fifMinLa)}
|
|
|
|
|
|
err := utils.Map2Struct(resMap, top)
|
2021-01-08 15:37:32 +08:00
|
|
|
|
model.BizErrIsNil(err, "解析top出错")
|
2020-09-01 10:34:11 +08:00
|
|
|
|
return top
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type Status struct {
|
|
|
|
|
|
// 系统版本
|
|
|
|
|
|
SysVersion SystemVersion
|
|
|
|
|
|
// top信息
|
|
|
|
|
|
Top Top
|
|
|
|
|
|
}
|