63

我与 supervisord 面临的一个问题是,当我有一个命令反过来产生另一个进程时,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 运行它并尝试从 supervisorctl 停止它时,只有顶级进程被杀死,而不是实际的 java 进程。

4

6 回答 6

109

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

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

  • supervisor_3.0a8 不起作用。
  • supervisor_3.0b2-1 按预期工作。
于 2013-12-13T12:10:38.547 回答
13

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

trap "kill -- -$$" EXIT

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

于 2014-03-12T21:15:03.067 回答
6

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

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

于 2012-02-01T19:18:11.477 回答
6

试试这个主管程序配置:

stopasgroup=true
killasgroup=true
stopsignal=INT
于 2018-06-28T06:36:25.053 回答
4

下面这篇文章对这个问题进行了深入的讨论:

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

于 2015-01-11T19:31:42.900 回答
0

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

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

于 2016-11-05T02:35:57.787 回答