我在使用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..somethingsupervisord配置文件如下所示:
[program:zookeeper]
command=zkServer.sh start-foreground
autorestart=true
stopsignal=KILL这类有多个子进程的进程在从supervisorctl中阻止它们时,supervisord不能很好地处理它们。因此,当我从supervisord运行这个命令并试图从supervisorctl停止它时,只有顶级进程会被终止,而实际的java进程却不会。
发布于 2013-12-13 20:10:39
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包:
发布于 2014-03-13 05:15:03
在supervisord调用的主bash脚本中执行以下操作,为我修复了这个问题:
trap "kill -- -$$" EXIT这会在主脚本退出时杀死整个进程组,例如,当它被supervisord杀死时。
发布于 2012-02-02 03:18:11
最近向supervisord添加了一个功能,可以将SIGKILL发送到整个进程组。它是github版的,但还没有正式发布。
如果进程id在文件中可用,则可以使用pid-proxy program
https://stackoverflow.com/questions/9090683
复制相似问题