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,则可以指定两个程序。
低优先级意味着程序首先启动,最后停止。