2012-07-07 15 views
7

私はトルネードを使ってフラスコアプリを走らせています。ちょっとした作業をしてからアプリを実行するシェルスクリプトがあります。スーパバイザで竜巻がきれいに再起動しない

#!/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サービスが再起動を期待している信号にあります。 スーパーバイザが送信するデフォルト信号は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

スーパーノートはSIGKILLを送信し続けていたので、私はそれを捨てて、信号を正しく処理するUbuntuの新スタートアップに切り替えました。 –

8

TERM信号のみをbashスクリプトtheapp.shに送信され、 Pythonのプロセスでは決して受け取りません。 supevisor configのプログラムセクションでstopasgroupオプションを試すことができます。これは、bash(および他のシェル)がシグナルをどのように扱うかにより適合します。あなたのシェルスクリプトは、唯一の「本当の」コマンド後preperationのものと何もしない場合

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

+2

'stopasgroup = true'は私のためにTornadoアプリで動作しました(pilbox) –

0

あるいは、あなたはシェルを置き換えます

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

との最後の行を置き換えることができますプロセスはPythonプロセスを使用しているため、後者はシグナルを直接取得し、アイドル状態のシェルプロセスが常に実行されていないという利点があります。

関連する問題