2012-07-07 48 views
7

我使用龙卷风来运行烧瓶应用程序,并且我有一个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

我和supervisord和uwsgi有类似的问题,但它也可能对Tornado有效。问题在于Tornado服务期望重启的信号。 supervisord发送的默认信号是SIG_TERM(请看stopsignal in docs)。我不知道什么龙卷风希望,但你可以尝试在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 
+0

嘿,就像一个说明:supervisord不断发送SIGKILL,所以我放弃了它,并切换到Ubuntu的新贵,它正确处理信号。 – 2012-11-27 22:29:27

8

术语信号只发送到bash脚本theapp.sh和从来没有收到蟒蛇进程。您可以尝试supevisor配置程序部分中的stopasgroup选项,该选项与bash(和其他shell)如何处理信号更加兼容[1]。

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

+2

'stopasgroup = true'为我提供了一个Tornado应用程序(pilbox) – 2014-11-20 13:46:19

0

另外,如果你的shell脚本只有“真实”的命令后,确实水面浮油的东西,什么都没有,你可以替换

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

最后一行将取代壳使用python进程进行处理,所以后者直接获取信号并带来额外的好处,即没有闲置的shell进程始终运行。