supervisord停止subprocess

其中一个问题就是,当我有一个命令转而产生另一个进程的时候,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 

supervisordconfiguration文件如下所示:

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

这种有多个孩子的过程在监督方面不能很好地处理。 所以,当我从supervisord运行这个,并试图从supervisorctl停止它,只有顶级进程被杀死,但不是实际的Java进程。

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

选项stopasgroup = true应设置在supervisord的程序部分,不仅停止父进程,而且还停止subprocess。

示例如下:

 [program:some_django] command=python manage.py runserver directory=/dir/to/app stopasgroup=true 

另外,请记住,你可能有一个更老的supervisord包,没有“stopasgroup”function。 我在Raspberry Pi上试过这些Debian软件包:

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

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

 trap "kill -- -$$" EXIT 

当主脚本退出时,如杀死supervisord时,这会杀死整个进程组。

最近supervisord添加了一个function,将SIGKILL发送到整个进程组。 它在github中,但尚未正式发布。

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

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

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

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

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