0

python3用のmod_wsgiを使用したUbuntu12.04の場合。

ユーザーセッションごとにPopenを使用して外部プログラムを起動するWSGIアプリケーション(実際には単なるスクリプト)があります(実際には小さなGTKプログラムであり、HTML5バックエンドを試しています)。

クライアント側にはJavascriptループがあり、数秒ごとに「keepalive」信号をWSGIに送信します。WSGIがセッションのシグナルをしばらく受信しなかった場合、WSGIは相対プロセスを強制終了します(そしてセッションを削除します)。

これは、Apacheを再起動/リロードする場合、またはWSGIスクリプト(AFAIKがアプリを自動的にリロードする)を編集する場合を除いて、うまく機能します。私がそのようなことをした場合、サブプロセスは強制終了されません。それらはまだ実行されており(ゾンビではありません)、手動で強制終了するだけです(WSGIは以前のセッションを失ったため、「古い」プロセスは強制終了されません)。

だから私は次のいずれかが欲しいです:

  • サーバーがWSGI側から停止/再起動/再ロードしていることを確認する方法。これにより、サーバーはサブプロセスを認識しながらクリーンアップできます。
  • 生成されたプロセスはmod_wsgiで終了する必要があります(現在、mod_wsgiが強制終了/再ロードされると、サブプロセスがInitに再接続されるようです)

これが私が使用するVirtualHostです:

<VirtualHost *:80>

WSGIDaemonProcess deckard_qh user=deckard group=deckard threads=5
WSGIScriptAlias / /home/deckard/wsgi/deckard_qh.wsgi
Alias /ressources /home/deckard/ressources

<Directory /home/deckard/wsgi>
    WSGIProcessGroup deckard_qh
    WSGIApplicationGroup %{GLOBAL}
    Order deny,allow
    Allow from all
</Directory>

<Directory /home/deckard/ressources>
    Order deny,allow
    Allow from all
</Directory>

WSGIProcessGroup deckardandを追加してみましたがWSGIApplicationGroup %{GLOBAL}この回答のとおり)、何も変わりませんでした。os.setsid()WSGIスクリプトの先頭にも追加しましたが、結果がありません。

4

2 に答える 2

2

これは単なるスケッチですが、単純な解決策(子供が自分で管理する、私のお気に入りの種類の子供ソリューション!)は、Popenプロセスにキルタイムアウトを追加することで、5分以内に「キープアライブ」を受け取らなかった場合(またはあなたが正しいと思うものは何でも)彼らは状態を保存し(適切な場合)そして終了しますか?

gtk_main_quit()は、イベントループを終了するために使用するものだと思いましたが、ベースから外れた場合は、子プロセスを終了するものに置き換えてください=)また、gtk偶数ループには独自のタイマー関数があると思いますこれはスレッド化とは異なる実装になりますが、投稿した内容をテストしたかったのです。

import datetime
from threading import Timer

# dummy timestamp for testing, gong should be the 
# timestamp of the last keepAlive signal
gong = datetime.datetime(2012, 8, 16, 16, 3, 18, 341121)  

#seconds before kill check is performed
idle = 5

def bringOutYourDead():
    """If the last keep alive time stamp is more than 5 minutes ago, I am Audi 500."""
    stoneDeadIn =  5
    if datetime.datetime.now() - datetime.timedelta(minutes=stoneDeadIn) >= gong:
        # I used print for whatever command for testing
        print('save_state_or_whatever()')
        print('gtk_main_quit()')
    else:
        print("I'm not dead yet!'")
    # recurse this as you see fit

dung = Timer(idle, bringOutYourDead)
dung.start()
于 2012-08-16T20:52:55.680 に答える
1

試しましたsudo service apache2 gracefulか?

USR1またはグレースフルシグナルにより、親プロセスは、現在の要求の後に終了するように(または、何も提供していない場合はすぐに終了するように)子にアドバイスします。親は構成ファイルを再度読み取り、ログファイルを再度開きます。各子が消滅すると、親はそれを新世代の構成の子に置き換えます。これにより、新しい要求の処理がすぐに開始されます。

http://httpd.apache.org/docs/2.4/stopping.html#graceful

于 2012-08-15T18:54:50.260 に答える