diff --git a/src/monitor/process.go b/src/monitor/process.go index e9a42ab..9c428e7 100644 --- a/src/monitor/process.go +++ b/src/monitor/process.go @@ -4,22 +4,37 @@ import ( "strings" "time" - "github.com/shirou/gopsutil/v4/process" "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{} - ps, _ := process.Processes() - for _, p := range ps { - cmd, _ := p.Cmdline() - if cmd == "" { - continue + 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() @@ -41,6 +56,7 @@ func (s Process) List(m *ice.Message, arg ...string) { 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) @@ -50,12 +66,12 @@ func (s Process) List(m *ice.Message, arg ...string) { stat["ice.bin"] += int(mem.RSS) stat["ice.num"]++ if strings.Contains(cmd, "-bash -c") { - continue + 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") { @@ -68,3 +84,14 @@ func (s Process) List(m *ice.Message, arg ...string) { } 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) + } +}