我使用的是龙卷风来运行应用程序烧瓶,和我有一个shell脚本,做一点点工作,然后运行该应用程序。
#!/usr/bin/env bash
some_work
more_work
python /usr/share/theapp/theapp.py
我用的主管来管理这个小脚本。 启动精品工程( sudo supervisorctl start theapp.sh
),但是当我要重新启动,python的子进程不退出和徘徊,占领港口和防止再次启动。 我已经尝试添加陷阱,以确保当脚本由主管停止Python代码真正停止,但是这并没有奏效。 我试着切换出去GEVENT的WSGI服务器龙卷风,并有同样的问题。 我应该怎么做这个小脚本?
术语信号只发送到bash脚本theapp.sh
也不会被蟒蛇过程中收到的。 您可以尝试stopasgroup
在supevisor配置的程序段,这是多么的bash(和其他贝壳)更兼容的选项处理信号[1]。
[1] http://www.vidarholen.net/contents/blog/?p=34
另外,如果你的shell脚本只有“真实”的命令后,确实水面浮油的东西,什么都没有,你可以替换最后一行
exec python /usr/share/theapp/theapp.py
将与蟒蛇过程更换外壳的过程,所以后者直接与你没有运行所有的时间空闲壳过程中的额外的好处得到的信号。
我已经与supervisord和uwsgi类似的问题,但它可能对龙卷风是有效的了。 问题是与龙卷风服务预计将重新启动的信号。 该supervisord发送默认的信号是SIG_TERM(看stopsignal的文档 )。 我不知道什么龙卷风希望,但你可以尝试在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