停止主管进程而不会终止其他子进程

停止主管进程而不会终止其他子进程

问题描述:

我使用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将发送指定的stopsignalTERM默认),并在杀死它之前等待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 
     } 
    } 
} 
+0

我想这一点,但我不能得到'pcntl_signal'回调的工作。我发布了一个新的[问题](http://*.com/questions/35979253/pcntl-signal-callbacks-are-not-executed)。 – user3288346