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  }