【问题标题】:Tornado doesn't restart cleanly in supervisor龙卷风不会在主管中干净地重新启动
【发布时间】:2012-07-07 15:22:57
【问题描述】:

我正在使用 tornado 运行烧瓶应用程序,并且我有一个 shell 脚本,它做了一些工作,然后运行应用程序。

#!/usr/bin/env bash
some_work
more_work
python /usr/share/theapp/theapp.py

我使用主管来管理这个小脚本。启动工作正常(sudo supervisorctl start theapp.sh),但是当我想重新启动时,python 子进程不会退出并挂起,占用端口并阻止再次启动。我尝试添加陷阱以确保在脚本被主管停止时确实停止了 python 代码,但这并没有奏效。我已经尝试为 gevent 的 wsgi 服务器切换龙卷风并且遇到了同样的问题。我应该怎么做这个小脚本?

【问题讨论】:

    标签: python tornado supervisord


    【解决方案1】:

    我在 supervisord 和 uwsgi 上遇到过类似的问题,但它可能对 Tornado 也有效。问题在于 Tornado 服务期望重新启动的信号。 supervisord 发送的默认信号是 SIG_TERM(查看stopsignal in docs)。我不确定 Tornado 期望什么,但您可以在 supervisord 配置中尝试更多选项,例如:

    # /etc/supervisor.d/myprogram.ini
    # http://supervisord.org/configuration.html#program-x-section-values
    [program:myprogram]
    command=/path/to/script/
    ....
    stopsignal=INT
    

    stopsignal=HUP
    

    【讨论】:

    • 嘿,请注意:supervisord 一直在发送 SIGKILL,所以我放弃了它并切换到 Ubuntu 的新贵,它可以正确处理信号。
    【解决方案2】:

    TERM 信号只发送到 bash 脚本theapp.sh,python 进程永远不会收到。您可以在 supevisor 配置的程序部分尝试stopasgroup 选项,该选项更符合 bash(和其他 shell)处理信号的方式[1]。

    [1]http://www.vidarholen.net/contents/blog/?p=34

    【讨论】:

    • stopasgroup = true 使用 Tornado 应用程序 (pilbox) 为我工作
    【解决方案3】:

    或者,如果您的 shell 脚本只做准备工作,而在“真实”命令之后什么都不做,您可以将最后一行替换为

    exec python /usr/share/theapp/theapp.py
    

    这将用 python 进程替换 shell 进程,因此后者直接获取信号,并具有额外的好处,即您没有空闲的 shell 进程一直在运行。

    【讨论】:

      猜你喜欢
      • 2014-11-20
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 2020-10-15
      • 1970-01-01
      相关资源
      最近更新 更多