监督停止子进程

时间:2012-02-01 04:11:58

标签: bash apache-zookeeper supervisord ubuntu-11.04

我面临的一个问题是,当我有一个命令反过来产生另一个进程时,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

supervisord配置文件如下所示:

[program:zookeeper]
command=zkServer.sh start-foreground
autorestart=true
stopsignal=KILL

当涉及到阻止它们supervisorctl时,supervisord没有很好地处理这些具有多个子节点的进程。因此,当我从supervisord运行它并尝试从supervisorctl停止它时,只有顶级进程被杀死而不是实际的java进程。

6 个答案:

答案 0 :(得分:80)

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

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

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

答案 1 :(得分:11)

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

trap "kill -- -$$" EXIT

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

答案 2 :(得分:6)

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

如果文件中有进程ID,则可以使用pid-proxy program

答案 3 :(得分:3)

以下文章对该问题进行了深入讨论:

http://veithen.github.io/2014/11/16/sigterm-propagation.html

答案 4 :(得分:2)

尝试此主管程序配置:

Object

答案 5 :(得分:0)

您还可以使用/conf.d/your-configuration.conf文件中的优先级。例如,如果您想先运行zookeeper,然后再运行kafka,则可以指定两个程序。

较低的优先级意味着程序首先启动并最后停止。