停止主管进程而不会终止其他子进程
问题描述:
我使用supervisord来管理我的工作者节点gearman。这个配置文件看起来像这样停止主管进程而不会终止其他子进程
[program:public_pdf_convert]
process_name = pdf_convert_%(process_num)02d
command = /usr/local/bin/php worker_pdf_convert.php
numprocs = 2
directory = /projects/mv2/deliver/batch/batch/workers/
stopsignal = INT
[program:public_video_convert]
process_name = video_convert_%(process_num)02d
command = /usr/local/bin/php worker_video_convert.php
numprocs = 4
directory = /projects/mv2/deliver/batch/batch/workers/
stopsignal = INT
当我开始主管,无论是工人类型(public_video_convert)和(public_pdf_convert)分别启动4点2的过程。
现在我想停止监督,而不杀死这六个进程。我尝试了不同的stopsignal
值,但没有运气。基本上,我希望忙碌的流程在完成时继续运行并保持准确。这可能吗?
答
你必须直接在你的php worker中处理信号。 Supervisord将发送指定的stopsignal
(TERM
默认),并在杀死它之前等待stopwaitsecs
。
为了实现这个目标,我做这在我的工人:
class Worker
{
protected $shouldStop = false;
public function stop()
{
$this->shouldStop = true;
}
protected function main()
{
// You handle both SIGINT and SIGTERM and add stop method as a callback
pcntl_signal(SIGTERM, [$this, 'stop']);
pcntl_signal(SIGINT, [$this, 'stop']);
while (true) {
// Calls signal handlers for pending signals
pcntl_signal_dispatch();
if (true === $this->shouldStop) {
// handler was called
break;
}
// Do your stuff here
}
}
}
我想这一点,但我不能得到'pcntl_signal'回调的工作。我发布了一个新的[问题](http://*.com/questions/35979253/pcntl-signal-callbacks-are-not-executed)。 – user3288346