-
Notifications
You must be signed in to change notification settings - Fork 0
/
ProcessManager.php
133 lines (119 loc) · 3.51 KB
/
ProcessManager.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
<?php
/**
* Date: 2019-10-16
* Time: 17:22
*/
namespace Moon;
class ProcessManager
{
protected $commandPrefix;
protected $commandsConfig = [];
protected $monitorProcess;
protected $logFile;
protected $errorLogFile;
public function __construct(
$monitorProcess, array $commandsConfig, $commandPrefix = '',
$logFile = '/dev/null', $errorLogFile = '/dev/null'
)
{
$this->monitorProcess = $monitorProcess;
$this->commandsConfig = $commandsConfig;
$this->commandPrefix = $commandPrefix;
$this->logFile = $logFile;
$this->errorLogFile = $errorLogFile;
}
/**
* 管理进程
* @param string $action start|stop|restart|status
* @throws ManagerException
*/
public function manageProcess($action)
{
if (!in_array($action, ['start', 'stop', 'restart', 'status'])) {
throw new ManagerException('Unsupported action ' . $action);
}
switch ($action) {
case "start" :
$this->stopMonitorProcess();
$this->stopWorkProcess();
$this->startMonitorProcess(); //worker进程启动都交给MonitorProcess,同时也防止了重复启动worker进程
break;
case "stop" :
$this->stopMonitorProcess();
$this->stopWorkProcess();
break;
case 'restart':
$this->stopMonitorProcess();
$this->stopWorkProcess();
$this->startMonitorProcess();
break;
case "status" :
$this->workProcessStatus();
break;
default :
echo "need Argv start|stop|restart|status\n";
break;
}
}
/**
* 检查进程状态
*/
public function workProcessStatus()
{
foreach ($this->commandsConfig as $v) {
$command = $this->commandPrefix . $v['command'];
$pids = Process::getProcessPid($command);
if (false == $pids) {
echo "\x1B[31m进程未正常启动" . $command . " \x1B[0m \n";
} else {
echo "进程状态正常:" . $command . " \n";
}
}
}
/**
* 开启监控进程
*/
public function startMonitorProcess()
{
$command = $this->commandPrefix . $this->monitorProcess;
Process::startProcess($command, $this->logFile, $this->errorLogFile);
}
/**
* 关闭监控进程
*/
public function stopMonitorProcess()
{
$command = $this->commandPrefix . $this->monitorProcess;
$pids = Process::getProcessPid($command);
if ($pids) {
foreach ($pids as $pid) {
Process::killProcessByPid($pid);
}
}
}
/**
* 开启工作进程
*/
public function startWorkProcess()
{
foreach ($this->commandsConfig as $command) {
$command = $this->commandPrefix . $command;
Process::startProcess($command, $this->logFile, $this->errorLogFile);
}
}
/**
* 关闭工作进程
*/
public function stopWorkProcess()
{
foreach ($this->commandsConfig as $command) {
$command = $this->commandPrefix . $command;
$pids = Process::getProcessPid($command);
if ($pids) {
foreach ($pids as $pid) {
Process::killProcessByPid($pid);
}
}
}
}
}