我正在运行supervisor 3.2.0-2ubuntu0.2 Ubuntu 16.04。我想更改我的某个进程使用的命令,但我需要确保supervisor向它发送正确的信号,以便进程可以结束;不幸的是,尽管我已经请求了TERM,但supervisor仍在发送SIGKILL。
[program:my-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/worker/job --param=a,b,c
autostart=true
autorestart=true
stopwaitsecs=10
user=worker
stopsignal=TERM
numprocs=1
stdout_logfile=/var/log/supervisor/worker.log
stderr_logfile=/var/log/supervisor/worker-error.log
如果我遵循Supervisor 未加载新的配置文件更改“命令”后(例如php /home/worker/job --param=a,b,c,d
:)我在日志中收到以下内容:
2018-08-08 09:05:21,514 INFO waiting for worker_00 to stop
2018-08-08 09:05:21,533 INFO stopped: worker_00 (terminated by (9) SIGKILL)
我特别需要确保 SIGTERM 已发送 - 我已经深入研究了代码,但没有发现任何明显表明我的配置不正确的东西。我调用了错误的命令吗?service supervisord restart
触发了相同的操作。
答案1
Supervisord 向你的 worker 发送 SIGTERM,但 worker 需要拦截该信号并完成关闭工作。然后它需要将 SIGCHLD 发送回 Supervisord。
如果 Supervisord 在一定时间内未收到 SIGCHLD,它会使用 SIGKILL 作为最后的手段来终止该工作程序。请参阅此处有关 stopwaitsecs 的部分:http://supervisord.org/configuration.html
下面是一个如何在 PHP 中处理信号的示例:https://stackoverflow.com/questions/7864349/how-do-i-catch-a-kill-or-hup-or-user-abort-signal