我正在通过主管运行schroot会话中的Gunicorn服务器。我的问题是,当使用“监督或停止”停止服务时,该服务并没有完全停止。
这是控制我的服务器的脚本(简化),它在前台运行gunicorn:
# gunicorn.sh
schroot -c gunicorn -r -- bash -c "gunicorn --workers=1 myapp.wsgi:application" 这是运行此脚本的我的主管配置:
[program:gunicorn]
command=/home/test/gunicorn.sh
stderr_logfile=/var/log/gunicorn.err.log
stdout_logfile=/var/log/gunicorn.out.log 当我通过"supervisorctl start“启动服务时,我的流程树如下所示:
supervisord(7175)---gunicorn.sh(8061)---schroot(8067)---gunicorn(8068)---gunicorn(8073)---{gunicorn}(8078)现在,当我用"supervisorctl“停止服务时,相应的主管进程及其直接子进程gunicorn.sh将被终止。但是,schroot进程本身仍然存在,并且现在是init进程的子代:
schroot(8067)---gunicorn(8068)---gunicorn(8073)---{gunicorn}(8078)这整个行为似乎都与施罗德和古尼科恩的工作方式有关。
如何让主管正确地停止我的schroot托管进程?
发布于 2014-12-17 19:57:59
必须先和主管联系:
# gunicorn.sh
exec schroot -c gunicorn -r -- bash -c "gunicorn --workers=1 myapp.wsgi:application"发布于 2016-09-13 18:25:10
我今天解决了同样的问题同样的问题也会被引用,例如这里。
使用监督者运行程序通常需要使用exec()系统调用来执行任何操作--因为它用自身替换了原始进程,使得PID (这是很重要的)由主管来管理(当然,不与终端分离)。
在施罗德会议上启动一只火鸟总是产生两个过程--施罗德--这是被主管引用的--和枪手的主人(工人并不重要)。
调用主管中的stop只会杀死schroot,并使gunicorn主迁移到init (PID=1),使其实际运行。
如果没有色度,最简单的方法就是“执行古尼科恩/任何/”。
我发现似乎没问题的解决办法是这样的:
广告1.使用pidproxy
[program:xxx]
command = pidproxy /path/to/pid/file /path/to/xxx使用任何方法将pid写成文件。在应用程序启动期间,我使用了以下代码片段:
pid_file = os.path.join(conf.data_dir, "eventaid.pid")
with open(pid_file, "w") as fout:
fout.write(str(os.getpid()))广告3.在脚本/path/to/xxx中使用exec
# activate venv
. $HOME/.virtualenvs/python3-xxx/bin/activate
# start within schroot
exec schroot -c jessie -- sh -c "exec gunicorn <whatever>"现在发送SIGTERM/SIGKILL/.从内部主管将实际发送SIGTERM/SIGKILL/.会把信号传送给真的杀死它的PID。
https://stackoverflow.com/questions/27212951
复制相似问题