supervisord 进程不会重新加载新的 php 代码

Jur*_*man 6 php supervisord

对于同步处理,我们使用带有 beanstalkd 队列的 supervisord。应用程序和工作代码都是用 php 编写的(使用SlmQueue)。我注意到当我们部署新代码时,新代码不适用于工作进程。我不太确定是什么原因,但我确实发现了:

  1. service supervisor restart 不重启进程(PID保持不变)
  2. supervisorctl reload 重新加载所有进程,现在使用新代码
  3. supervisorctl 无法(据我所知)仅重新加载一个程序并保持其他程序仍在运行

我正在寻找一种部署新代码的方法(通过 ansible 和 git checkout 工作)并且不需要重新启动完整的主管进程及其所有子进程。我们使用 PHP 5.5 运行 Ubuntu 12.04 机器。我猜操作码缓存可能会起作用,但我不确定如何触发这些特定文件的刷新。

有没有办法优雅地重新加载进程而不是完全重新加载所有监督子进程?或者如果原因可能是操作码缓存,是否可以使用某个触发器刷新缓存?

Jef*_*eld 2

您可以使用supervisorctl仅重新启动一个进程。

supervisorctl -c /etc/supervisord/supervisord.conf
Run Code Online (Sandbox Code Playgroud)

一旦您进入主管子 shell,您就可以使用statusrestart来重新加载您的作业。考虑下面的例子,我重新加载花

supervisor> status
   beat_worker:beat_worker_00          RUNNING   pid 32274, uptime 0:27:45
   flower                              RUNNING   pid 32275, uptime 0:27:45
   workers:worker_wkrone_00            RUNNING   pid 32278, uptime 0:27:45
   workers:worker_wkrtwo_00            RUNNING   pid 32276, uptime 0:27:45
   workers:worker_wkrthree_00          RUNNING   pid 32277, uptime 0:27:45

supervisor> restart flower
   flower: stopped
   flower: started
Run Code Online (Sandbox Code Playgroud)

现在,如果您再次执行状态操作,您将看到 pidflower已更改。

supervisor> status
   beat_worker:beat_worker_00          RUNNING   pid 32274, uptime 0:28:13
   flower                              RUNNING   pid 32713, uptime 0:00:08
   workers:worker_wkrone_00            RUNNING   pid 32278, uptime 0:28:13
   workers:worker_wkrtwo_00            RUNNING   pid 32276, uptime 0:28:13
   workers:worker_wkrthree_00          RUNNING   pid 32277, uptime 0:28:13
Run Code Online (Sandbox Code Playgroud)

然后只需执行 actrl -d即可退出supervisord shell。如果您检查 status 的输出,您将看到作业的 pid 已更改并且正常运行时间计数已重新启动。