我正在使用gearman和supervisor来管理我的工作流程。我有一个案例,我需要停止/重启主管而不影响当前正在运行的进程。
e.g。我已将supervisor配置文件中的numprocs
值配置为2.我启动主管并运行2个进程。
现在我想重新启动supervisor,这样进程数就变为4,其中supervisor只控制两个新进程。有没有办法可以做到这一点。
我尝试在重新启动之前重命名sock
文件。它没用。我正在使用Amazon Linux。
我将详细阐述我正在做的事情。我有一些齿轮工的工人流程,由主管管理。它工作正常,但是当我重新启动主管时,即使工人正忙于处理工作,工人也会被杀,新员工也会被启动。所以,我失去了流程所做的所有工作。
所以,我使用php-pcntl拦截主管产生的信号,然后在作业结束后退出。这似乎运作良好。
我发送如下的中断:
supervisorctl signal SIGTERM all
然后在我的工作代码中,我有以下内容。
public static function work(GearmanWorker $gw){
pcntl_signal(SIGTERM, function($sig){
exit;
});
while(true){
$gw->work();
// Calls signal handlers for pending signals
pcntl_signal_dispatch();
}
}
现在,当我更新我的工作人员代码时,我应该重新启动主管。但是,如果我直接重启,那么即使采用上述实现,所有进程都会终止。我想避免终止旧的prcoesses,因为他们会在调用pcntl_signal_dispatch();
时自行退出。