0

在带有用于 python 3 的 mod_wsgi 的 Ubuntu 12.04 上。

我有一个 WSGI 应用程序(实际上只是一个脚本),它碰巧为每个用户会话启动了一个带有 Popen 的外部程序(它实际上是一个小型 GTK 程序,我正在试验它的 HTML5 后端)。

客户端有一个 Javascript 循环,它每隔几秒向 WSGI 发送一个“保持活动”信号。如果 WSGI 有一段时间没有收到任何会话信号,那么它将杀死相关进程(并删除会话)。

这很好用,除非我重新启动/重新加载 Apache 或编辑 WSGI 脚本(AFAIK 会自动重新加载应用程序)。如果我这样做,子进程不会被杀死。它们仍在运行(它们不是僵尸),我所能做的就是手动杀死它们(WSGI 丢失了以前的会话,因此它不会杀死任何“旧”进程)。

所以我想要以下之一:

  • 一种注意到服务器正在从 WSGI 端停止/重新启动/重新加载的方法,以便它可以在知道它们的同时清理它的子进程
  • 生成的进程应该与 mod_wsgi 一起死亡(目前似乎子进程在 mod_wsgi 被杀死/重新加载时重新附加到 Init)

这是我使用的虚拟主机:

<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 回答