3

我最近使用 PHP5-FPM、Gearman 和 Supervisor 设置了 Ubuntu Natty。我已经编辑了我的 Supervisord 配置来运行 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

lsof -i -P这是我在运行 supervisord 之前的相关信息(仅显示 gearmand 和 php 进程) :

COMMAND     PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
gearmand  29314  gearman    6u  IPv4 328139      0t0  TCP localhost:4730 (LISTEN)    

这就是我在我lsof -i -P之后得到的/etc/init.d/supervisor stop && /etc/init.d/supervisor start

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 stop && /etc/init.d/gearman-job-server start

这对我来说似乎不正常,因为当我停止 supervisord 时,它应该停止

这是supervisord的工作方式吗?!有什么办法可以防止这种情况发生吗?!

提前致谢。

编辑

我发现了导致问题的原因。这是与 supervisord.conf 和我的初始化脚本的小冲突。

我的 supervisord.conf 文件具有以下设置:

pidfile=/tmp/supervisord.pid

但是我的初始化脚本/etc/init.d/supervisord具有以下设置:

NAME=supervisord
PIDFILE=/var/run/$NAME.pid

所以我只是更改了 supervisord.conf 中的设置以匹配我的 init 脚本中的设置。

另外,我stopsignal=KILL在我的supervisord配置文件(supervisord.conf)中添加了程序配置。

感谢 Minaz 的指导。

4

1 回答 1

5

我总是为我的主管配置文件包含停止信号配置选项。这允许在请求停止时终止 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
于 2011-11-26T16:42:04.463 回答