首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >阻止Gunicorn在schroot会话中运行

阻止Gunicorn在schroot会话中运行
EN

Stack Overflow用户
提问于 2014-11-30 11:57:39
回答 2查看 442关注 0票数 0

我正在通过主管运行schroot会话中的Gunicorn服务器。我的问题是,当使用“监督或停止”停止服务时,该服务并没有完全停止。

这是控制我的服务器的脚本(简化),它在前台运行gunicorn:

代码语言:javascript
复制
# gunicorn.sh
schroot -c gunicorn -r -- bash -c "gunicorn --workers=1 myapp.wsgi:application" 

这是运行此脚本的我的主管配置:

代码语言:javascript
复制
[program:gunicorn]
command=/home/test/gunicorn.sh
stderr_logfile=/var/log/gunicorn.err.log
stdout_logfile=/var/log/gunicorn.out.log 

当我通过"supervisorctl start“启动服务时,我的流程树如下所示:

代码语言:javascript
复制
supervisord(7175)---gunicorn.sh(8061)---schroot(8067)---gunicorn(8068)---gunicorn(8073)---{gunicorn}(8078)

现在,当我用"supervisorctl“停止服务时,相应的主管进程及其直接子进程gunicorn.sh将被终止。但是,schroot进程本身仍然存在,并且现在是init进程的子代:

代码语言:javascript
复制
schroot(8067)---gunicorn(8068)---gunicorn(8073)---{gunicorn}(8078)

这整个行为似乎都与施罗德和古尼科恩的工作方式有关。

如何让主管正确地停止我的schroot托管进程?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-17 19:57:59

必须先和主管联系:

代码语言:javascript
复制
# gunicorn.sh
exec schroot -c gunicorn -r -- bash -c "gunicorn --workers=1 myapp.wsgi:application"
票数 0
EN

Stack Overflow用户

发布于 2016-09-13 18:25:10

我今天解决了同样的问题同样的问题也会被引用,例如这里

使用监督者运行程序通常需要使用exec()系统调用来执行任何操作--因为它用自身替换了原始进程,使得PID (这是很重要的)由主管来管理(当然,不与终端分离)。

在施罗德会议上启动一只火鸟总是产生两个过程--施罗德--这是被主管引用的--和枪手的主人(工人并不重要)。

调用主管中的stop只会杀死schroot,并使gunicorn主迁移到init (PID=1),使其实际运行。

如果没有色度,最简单的方法就是“执行古尼科恩/任何/”。

我发现似乎没问题的解决办法是这样的:

  1. 使用pidproxy助手程序启动schroot gunicorn进程(来自主管分发版/usr/bin/pidproxy)
  2. 将gunicorn进程的PID写入文件(通常通过修改应用程序启动)
  3. 尽可能正确地使用exec。

广告1.使用pidproxy

代码语言:javascript
复制
[program:xxx]
command = pidproxy /path/to/pid/file /path/to/xxx

使用任何方法将pid写成文件。在应用程序启动期间,我使用了以下代码片段:

代码语言:javascript
复制
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

代码语言:javascript
复制
# 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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27212951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档