package monitor import ( "strings" "time" "shylinux.com/x/ice" kit "shylinux.com/x/toolkits" "github.com/shirou/gopsutil/v4/mem" "github.com/shirou/gopsutil/v4/process" ) type Process struct { list string `name:"list name auto" help:"进程"` } func (s Process) Weight(m *ice.Message, arg ...string) { v, _ := mem.VirtualMemory() stat := map[string]int{} s.getList(func(p *process.Process, cmd string) { name, _ := p.Name() mem, _ := p.MemoryInfo() stat[name] += int(mem.RSS) }) kit.For(stat, func(key string, value int) { m.Push("name", key).Push("rss", kit.FmtSize(value)) }) m.DisplayStoryPie().SortIntR("rss").Action(s.Weight) m.Push("name", "rest").Push("rss", kit.FmtSize(v.Available)) } func (s Process) List(m *ice.Message, arg ...string) { stat := map[string]int{} m.Action(s.Weight) s.getList(func(p *process.Process, cmd string) { if len(arg) > 0 && !strings.Contains(cmd, arg[0]) { return } 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("name", name) 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") { return } 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{}) } func (s Process) getList(cb func(p *process.Process, cmd string)) { ps, _ := process.Processes() for _, p := range ps { cmd, _ := p.Cmdline() if cmd == "" { continue } cb(p, cmd) } }