在Ubuntu 12.04與mod_wsgi的Python的3處理來自WSGI推出重啓後仍然運行/重裝服務器
我有一個正好與POPEN啓動外部程序的WSGI應用(實際上只是一個腳本)每個用戶會話(它實際上是一個小型的GTK程序,我正在試驗其HTML5後端)。
客戶端有一個Javascript循環,每隔幾秒向WSGI發送一個「保持活動」信號。如果WSGI在一段時間內沒有收到會話的任何信號,那麼它會殺死相關進程(並刪除會話)。
這很好,除了當我重新啓動/重新加載Apache或當我編輯WSGI腳本(該AFAIK自動重新加載應用程序)。 如果我這樣做,子流程不會被殺死。他們仍然運行(他們不是殭屍),我所能做的就是手動殺死他們(WSGI失去了前幾次會話,所以它不會殺死任何「舊」進程)。
所以我想執行下列操作之一:
- 注意到服務器已停止/重啓/從WSGI側重裝,以便它可以清理它的子過程,而它知道他們的一種方式
- 產生的進程應與mod_wsgi的死亡(目前似乎子過程重新連接到INIT時的mod_wsgi被殺害/再)
這裏是虛擬主機使用:
<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
和WSGIApplicationGroup %{GLOBAL}
(按this answer),但它並沒有改變任何東西。 我還在我的WSGI腳本的開頭添加了os.setsid()
,但沒有結果。
我覺得它可能與您在腳本中如何啓動它們更相關。你能舉一個例子說明你的wsgi腳本是如何啓動進程的? – jdi 2012-08-15 18:55:27
他們是否正在運行,還是他們處於僵局(殭屍)狀態?如果直接父母死亡並且不能等待進程結束狀態並且他們稍後完成,那麼他們可以像殭屍一樣四處閒逛,直到整個Apache被關閉。除了在進程表中輸入外,它們在該狀態下不消耗資源。 – 2012-08-15 21:56:50
我重申了這個問題。我希望現在更清楚。 @jdi這只是一個簡單的Popen。如果我在shell中的Python腳本中運行相關的代碼並殺死shell,那麼子進程也會被終止。我想mod_wsgi會對子進程做一些特殊的事情。 如果你仍然需要一些代碼,我會盡量縮短我的內容,然後再發布。 – 2012-08-15 22:07:22