diff --git a/src/monitor/process.go b/src/monitor/process.go new file mode 100644 index 0000000..e9a42ab --- /dev/null +++ b/src/monitor/process.go @@ -0,0 +1,70 @@ +package monitor + +import ( + "strings" + "time" + + "github.com/shirou/gopsutil/v4/process" + "shylinux.com/x/ice" + kit "shylinux.com/x/toolkits" +) + +type Process struct { + list string `name:"list name auto" help:"进程"` +} + +func (s Process) List(m *ice.Message, arg ...string) { + stat := map[string]int{} + ps, _ := process.Processes() + for _, p := range ps { + cmd, _ := p.Cmdline() + if cmd == "" { + continue + } + t, _ := p.CreateTime() + ts, _ := p.NumThreads() + cpu, _ := p.CPUPercent() + mem, _ := p.MemoryInfo() + conn, _ := p.Connections() + fd, _ := p.NumFDs() + rw, _ := p.IOCounters() + user, _ := p.Username() + name, _ := p.Name() + m.Push("time", strings.TrimSuffix(time.Unix(t/1000, t%1000).Format(ice.MOD_TIME), ".000")) + m.Push("pid", p.Pid) + m.Push("ts", ts) + m.Push("cpu", kit.Format("%.2f", cpu)) + m.Push("rss", kit.FmtSize(mem.RSS)) + m.Push("vms", kit.FmtSize(mem.VMS)) + m.Push("cs", len(conn)) + m.Push("fs", fd) + m.Push("reads", kit.FmtSize(rw.ReadBytes)) + m.Push("writes", kit.FmtSize(rw.WriteBytes)) + m.Push("user", user) + m.Push("cmd", kit.Select(name, cmd)) + stat["ts"] += int(ts) + stat["cs"] += len(conn) + stat["fs"] += int(fd) + stat["rss"] += int(mem.RSS) + if strings.Contains(cmd, "bin/ice.bin") { + stat["ice.bin"] += int(mem.RSS) + stat["ice.num"]++ + if strings.Contains(cmd, "-bash -c") { + continue + } + kit.If(strings.Contains(cmd, "bin/ice.bin space"), func() { stat["ice.space"]++ }) + kit.If(strings.Contains(cmd, "bin/ice.bin serve"), func() { stat["ice.serve"]++ }) + } + } + stats := map[string]string{} + kit.For(stat, func(key string, value int) { + if kit.IsIn(key, "rss", "ice.bin") { + stats[key] = kit.FmtSize(value) + } else { + stats[key] = kit.Format(value) + } + }) + m.StatusTimeCount(stats).SortIntR("rss") +} + +func init() { ice.Cmd("web.chat.dev.machine.process", Process{}) }