监督停止子进程

FUD*_*FUD 54 bash supervisord ubuntu-11.04 apache-zookeeper

我面对的一个问题是,当我有一个命令反过来产生另一个进程时,supervisord无法杀死它.

例如,我有一个java进程,当正常运行时就像

 $ zkServer.sh start-foreground
 $ ps -eaf | grep zk
 user 30404 28280  0 09:21 pts/2    00:00:00 bash zkServer.sh start-foreground
 user 30413 30404 76 09:21 pts/2    00:00:10 java -Dzookeeper.something..something
Run Code Online (Sandbox Code Playgroud)

supervisord配置文件如下所示:

[program:zookeeper]
command=zkServer.sh start-foreground
autorestart=true
stopsignal=KILL
Run Code Online (Sandbox Code Playgroud)

当涉及到阻止它们时,这些具有多个孩子的过程在监督下不能很好地处理supervisorctl.因此,当我从supervisord运行它并尝试从supervisorctl停止它时,只有顶级进程被杀死但不是实际的java进程.

kuz*_*vas 87

Rick Hanlon II遇到了同样的问题:https://coderwall.com/p/4tcw7w

应该在程序部分设置选项stopasgroup = true,以便supervisord不仅停止父进程,还停止子进程.

示例如下:

[program:some_django]
 command=python manage.py runserver
 directory=/dir/to/app
 stopasgroup=true
Run Code Online (Sandbox Code Playgroud)

此外,请记住,您可能有一个较旧的supervisord包没有"stopasgroup"功能.我在Raspberry Pi上尝试了这些Debian软件包:

  • supervisor_3.0a8不起作用.
  • supervisor_3.0b2-1按预期工作.

  • 另请注意,supervisord不会自动进行配置更改.您需要运行`supervisorctl update`以对配置应用更改,或重新启动supervisord进程. (6认同)
  • 这应该是默认选项. (4认同)
  • 这对于主管3.2来说非常适合我.谢谢. (2认同)

Fre*_*ski 12

在supervisord调用的主bash脚本的早期执行以下操作为我解决了问题:

trap "kill -- -$$" EXIT
Run Code Online (Sandbox Code Playgroud)

这会在主脚本退出时终止整个进程组,例如当它被supervisord杀死时.


Col*_*lor 9

尝试这个主管程序配置:

stopasgroup=true
killasgroup=true
stopsignal=INT
Run Code Online (Sandbox Code Playgroud)


小智 6

最近在supervisord中添加了一项功能,将SIGKILL发送给整个流程组.它在github但尚未正式发布.

如果进程标识在文件中可用,则可以使用pid-proxy程序