关于supervisor:解决supervisor不能监控程序子进程问题
先说一下遇到的问题,应用的是beanstalk队列,有两个tube, 应用 supervisor 监控 beanstalk 生产队列(主过程A),主过程A产生两个子过程(子过程B,子过程C),每个子过程解决一个tube的数据。 supervisor配置如下: [program:queue-worker]command=/usr/local/bin/php /var/www/html/ctc/console.php queue workeruser=www-dataautostart=trueautorestart=trueredirect_stderr=truestartretries=30startsecs=10解决生产队列的代码如下: /** * 启动生产队列 * * @command php console.php queue worker */public function wokerAction(){ echo "------ worker start ------" . PHP_EOL; $beanstalk = $this->getBeanstalk(); $logger = $this->getLogger('queue'); $beanstalk->addWorker( 'main', function (BeanstalkJob $job) use ($config, $logger) { $taskId = $job->getBody(); try { $manager = new MainQueue(); $manager->handle($taskId); } catch (\Throwable $e) { $logger->error("tube:main, task:{$taskId} exception " . kg_json_encode([ 'file' => $e->getFile(), 'line' => $e->getLine(), 'message' => $e->getMessage(), ])); } exit(0); } ); $beanstalk->addWorker( 'notice', function (BeanstalkJob $job) use ($config, $logger) { $taskId = $job->getBody(); try { $manager = new NoticeQueue(); $manager->handle($taskId); } catch (\Throwable $e) { $logger->error("tube:notice, task:{$taskId} exception " . kg_json_encode([ 'file' => $e->getFile(), 'line' => $e->getLine(), 'message' => $e->getMessage(), ])); } exit(0); } ); $beanstalk->doWork();}常常会呈现上面的报错,子过程B或者C就退出了,然而主过程没事。 ...