Supervisord为PHP和Gearman添加多个进程
我最近用PHP5-FPM、Gearman和Supervisor建立了UbuntuNatty。我已经编辑了我的Supervisord配置以运行Gearman workerSupervisord为PHP和Gearman添加多个进程,php,gearman,supervisord,Php,Gearman,Supervisord,我最近用PHP5-FPM、Gearman和Supervisor建立了UbuntuNatty。我已经编辑了我的Supervisord配置以运行Gearman worker [program:gearman] command=/usr/bin/php php_gearman_worker.php numprocs=1 directory=/root/sandbox stdout_logfile=/root/sandbox/supervisord.log environment=GEARMAN_
[program:gearman]
command=/usr/bin/php php_gearman_worker.php
numprocs=1
directory=/root/sandbox
stdout_logfile=/root/sandbox/supervisord.log
environment=GEARMAN_USER=gearman
autostart=true
autorestart=true
user=gearman
以下是我在运行supervisord之前执行lsof-I-p时的相关信息(仅显示gearmand和php进程):
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
gearmand 29314 gearman 6u IPv4 328139 0t0 TCP localhost:4730 (LISTEN)
下面是我在/etc/init.d/supervisor stop&/etc/init.d/supervisor start
之后lsof-I-p
得到的结果
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
gearmand 29314 gearman 6u IPv4 328139 0t0 TCP localhost:4730 (LISTEN)
gearmand 29314 gearman 11u IPv4 328206 0t0 TCP localhost:4730->localhost:39072 (ESTABLISHED)
php 29571 gearman 4u IPv4 329744 0t0 TCP localhost:39072->localhost:4730 (ESTABLISHED)
我没有看到supervisord本身的任何列表,我应该将supervisord视为命令之一吗
无论如何,当我停止并再次启动(或重新启动)supervisord时:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
gearmand 29314 gearman 6u IPv4 328139 0t0 TCP localhost:4730 (LISTEN)
gearmand 29314 gearman 11u IPv4 328206 0t0 TCP localhost:4730->localhost:39072 (ESTABLISHED)
gearmand 29314 gearman 12u IPv4 329754 0t0 TCP localhost:4730->localhost:51570 (ESTABLISHED)
php 29571 gearman 4u IPv4 329744 0t0 TCP localhost:39072->localhost:4730 (ESTABLISHED)
php 29619 gearman 4u IPv4 327233 0t0 TCP localhost:51570->localhost:4730 (ESTABLISHED)
看起来每次我停止并启动supervisord时,它都会创建另一个php进程,然后创建另一个。只有当我重新启动gearmand时,它才会恢复正常,即/etc/init.d/gearman-job-server停止和/etc/init.d/gearman-job-server启动
这对我来说似乎不正常,因为当我停止监督时,它应该停止
这就是supervisord的工作方式吗?!有什么办法可以阻止这种事情发生吗
提前谢谢
编辑
我找到了问题的原因。这与supervisord.conf和我的init脚本有一点冲突
我的supervisord.conf文件具有以下设置:
pidfile=/tmp/supervisord.pid
但是我在/etc/init.d/supervisord
上的init脚本具有以下设置:
NAME=supervisord
PIDFILE=/var/run/$NAME.pid
所以我只是更改了supervisord.conf中的设置,以匹配init脚本中的设置
此外,我还将stopsignal=KILL
添加到我的supervisord配置文件(supervisord.conf)中的程序配置中
感谢Minaz的指导。我总是为我的主管配置文件包含stopsignal配置选项。这允许在请求停止时终止gearman进程。试试这个:
[program:gearman]
command=/usr/bin/php php_gearman_worker.php
numprocs=1
directory=/root/sandbox
stdout_logfile=/root/sandbox/supervisord.log
environment=GEARMAN_USER=gearman
autostart=true
autorestart=true
user=gearman
stopsignal=KILL
我更新了supervisord.conf文件并添加了
stopsignal=KILL
,但当我停止supervisord时,它不会停止进程,不知道为什么只是好奇,你需要经常重新启动supervisord吗?不,我只是测试系统,以确保一切正常工作。它在停止和启动时做同样的事情,而不仅仅是重新启动。我发现了问题所在,我在编辑问题时发布了信息。当supervisord退出时,流程不会停止。这样,您就可以升级supervisord并保持长时间运行的进程运行