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 deckard
andを追加してみましたがWSGIApplicationGroup %{GLOBAL}
(この回答のとおり)、何も変わりませんでした。os.setsid()
WSGIスクリプトの先頭にも追加しましたが、結果がありません。