2012-07-07 47 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進程始終運行。