2016-03-03 167 views
0

我使用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值,但沒有運氣。基本上,我希望忙碌的流程在完成時繼續運行並保持準確。這可能嗎?

回答

1

你必須直接在你的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://stackoverflow.com/questions/35979253/pcntl-signal-callbacks-are-not-executed)。 – user3288346