github.com/zhongdalu/gf@v1.0.0/g/os/gproc/gproc_manager.go (about) 1 // Copyright 2018 gf Author(https://github.com/zhongdalu/gf). All Rights Reserved. 2 // 3 // This Source Code Form is subject to the terms of the MIT License. 4 // If a copy of the MIT was not distributed with this file, 5 // You can obtain one at https://github.com/zhongdalu/gf. 6 7 // 进程管理. 8 package gproc 9 10 import ( 11 "github.com/zhongdalu/gf/g/container/gmap" 12 "os" 13 ) 14 15 // 进程管理器 16 type Manager struct { 17 processes *gmap.IntAnyMap // 所管理的子进程map 18 } 19 20 // 创建一个进程管理器 21 func NewManager() *Manager { 22 return &Manager{ 23 processes: gmap.NewIntAnyMap(), 24 } 25 } 26 27 // 创建一个进程(不执行) 28 func (m *Manager) NewProcess(path string, args []string, environment []string) *Process { 29 p := NewProcess(path, args, environment) 30 p.Manager = m 31 return p 32 } 33 34 // 获取当前进程管理器中的一个进程 35 func (m *Manager) GetProcess(pid int) *Process { 36 if v := m.processes.Get(pid); v != nil { 37 return v.(*Process) 38 } 39 return nil 40 } 41 42 // 添加一个已存在进程到进程管理器中 43 func (m *Manager) AddProcess(pid int) { 44 if m.processes.Get(pid) == nil { 45 if process, err := os.FindProcess(pid); err == nil { 46 p := m.NewProcess("", nil, nil) 47 p.Process = process 48 m.processes.Set(pid, p) 49 } 50 } 51 } 52 53 // 移除进程管理器中的指定进程 54 func (m *Manager) RemoveProcess(pid int) { 55 m.processes.Remove(pid) 56 } 57 58 // 获取所有的进程对象,构成列表返回 59 func (m *Manager) Processes() []*Process { 60 processes := make([]*Process, 0) 61 m.processes.RLockFunc(func(m map[int]interface{}) { 62 for _, v := range m { 63 processes = append(processes, v.(*Process)) 64 } 65 }) 66 return processes 67 } 68 69 // 获取所有的进程pid,构成列表返回 70 func (m *Manager) Pids() []int { 71 return m.processes.Keys() 72 } 73 74 // 等待所有子进程结束 75 func (m *Manager) WaitAll() { 76 processes := m.Processes() 77 if len(processes) > 0 { 78 for _, p := range processes { 79 p.Wait() 80 } 81 } 82 } 83 84 // 关闭所有的进程 85 func (m *Manager) KillAll() error { 86 for _, p := range m.Processes() { 87 if err := p.Kill(); err != nil { 88 return err 89 } 90 } 91 return nil 92 } 93 94 // 向所有进程发送信号量 95 func (m *Manager) SignalAll(sig os.Signal) error { 96 for _, p := range m.Processes() { 97 if err := p.Signal(sig); err != nil { 98 return err 99 } 100 } 101 return nil 102 } 103 104 // 向所有进程发送消息 105 func (m *Manager) Send(data []byte) { 106 for _, p := range m.Processes() { 107 p.Send(data) 108 } 109 } 110 111 // 向指定进程发送消息 112 func (m *Manager) SendTo(pid int, data []byte) error { 113 return Send(pid, data) 114 } 115 116 // 清空管理器 117 func (m *Manager) Clear() { 118 m.processes.Clear() 119 } 120 121 // 当前进程总数 122 func (m *Manager) Size() int { 123 return m.processes.Size() 124 }