7

我正在使用 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 服务器切换龙卷风并且遇到了同样的问题。我应该怎么做这个小脚本?

4

3 回答 3

8

TERM 信号仅发送到 bash 脚本theapp.sh,python 进程从不接收。您可以尝试stopasgroupsupevisor 配置的程序部分中的选项,该选项与 bash(和其他 shell)处理信号的方式更兼容[1]。

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

于 2013-03-12T19:03:44.577 回答
1

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

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

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

于 2014-11-21T09:42:57.090 回答
0

我在 supervisord 和 uwsgi 上遇到过类似的问题,但它也可能对 Tornado 有效。问题在于 Tornado 服务期望重新启动的信号。supervisord 发送的默认信号是 SIG_TERM (查看docs中的 stopsignal )。我不确定 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
于 2012-07-07T13:28:08.043 回答