Python 龙卷风不';不要在管理器中干净地重新启动
我正在使用tornado运行一个flask应用程序,我有一个shell脚本,它做了一些工作,然后运行这个应用程序Python 龙卷风不';不要在管理器中干净地重新启动,python,tornado,supervisord,Python,Tornado,Supervisord,我正在使用tornado运行一个flask应用程序,我有一个shell脚本,它做了一些工作,然后运行这个应用程序 #!/usr/bin/env bash some_work more_work python /usr/share/theapp/theapp.py 我使用主管来管理这个小脚本。启动工作正常(sudo-supervisortl start theapp.sh),但当我想重新启动时,python子进程不会退出并挂起,占用了端口并阻止再次启动。我已经尝试添加陷阱,以确保在脚本被主管停止
#!/usr/bin/env bash
some_work
more_work
python /usr/share/theapp/theapp.py
我使用主管来管理这个小脚本。启动工作正常(
sudo-supervisortl start theapp.sh
),但当我想重新启动时,python子进程不会退出并挂起,占用了端口并阻止再次启动。我已经尝试添加陷阱,以确保在脚本被主管停止时python代码确实停止,但这并没有起作用。我曾尝试将tornado切换到gevent的wsgi服务器,但也遇到了同样的问题。我应该如何编写这个小脚本?我在supervisord和uwsgi方面也遇到过类似的问题,但它可能对Tornado也有效。问题在于Tornado服务期望重新启动的信号。
supervisord发送的默认信号是SIG_TERM(查看)。我不确定Tornado期望的是什么,但您可以在supervisord配置中尝试更多选项,如:
# /etc/supervisor.d/myprogram.ini
# http://supervisord.org/configuration.html#program-x-section-values
[program:myprogram]
command=/path/to/script/
....
stopsignal=INT
或
术语信号只发送到bash脚本
theapp.sh
,python进程从未接收到。您可以尝试supevisor配置的程序部分中的stopasgroup
选项,该选项与bash(和其他shell)处理信号的方式更兼容[1]
[1] 或者,如果shell脚本只执行预操作,而在“real”命令之后不执行任何操作,则可以将最后一行替换为
exec python /usr/share/theapp/theapp.py
这将用python进程取代shell进程,因此python进程可以直接获得信号,而且还有一个额外的好处,那就是您不需要一直运行空闲的shell进程。嘿,请注意:supervisord一直发送SIGKILL,所以我放弃了它,转而使用Ubuntu的upstart,它能正确处理信号。
stopasgroup=true
在Tornado应用程序(pilbox)中为我工作
exec python /usr/share/theapp/theapp.py