我面临的一个问题是,当我有一个命令反过来产生另一个进程时,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进程。
答案 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软件包:
答案 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,则可以指定两个程序。
较低的优先级意味着程序首先启动并最后停止。