我正在使用龙卷风来运行一个烧瓶应用程序,我有一个shell脚本,可以做一些工作然后运行应用程序。
#!/usr/bin/env bash
some_work
more_work
python /usr/share/theapp/theapp.py
我使用主管来管理这个小脚本。启动工作正常(sudo supervisorctl start theapp.sh
),但是当我想重新启动时,python子进程不会退出并挂起,占用端口并再次阻止启动。我已经尝试添加陷阱以确保在主管停止脚本时确实停止了python代码,但这没有用。我已经尝试为gevent的wsgi服务器切换龙卷风并且遇到了同样的问题。我该怎么做这个小脚本?
答案 0 :(得分:8)
TERM信号仅发送到bash脚本theapp.sh
,并且从未被python进程接收。您可以在supevisor配置的程序部分尝试stopasgroup
选项,它与bash(和其他shell)处理信号的方式[1]更加兼容。
答案 1 :(得分:1)
或者,如果你的shell脚本只执行preperation的东西,那么" real"命令,你可以用
替换最后一行exec python /usr/share/theapp/theapp.py
这将用python进程替换shell进程,因此后者直接获取信号,并且具有额外的好处,即您不会一直运行空闲shell进程。
答案 2 :(得分:0)
我和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