从wsgi启动的进程在重新启动/重新加载后仍在运行

2024-06-11 20:43:38 发布

您现在位置:Python中文网/ 问答频道 /正文

在Ubuntu12.04上使用mod\wsgi for python3。在

我有一个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 deckardWSGIApplicationGroup %{GLOBAL}(根据this answer),但它没有改变任何东西。 我还在WSGI脚本的开头添加了os.setsid(),但没有结果。在


Tags: 程序脚本mod应用程序wsgihome信号进程
2条回答

你试过sudo service apache2 graceful吗?在

^{bq}$

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

这只是一个草图,但是一个简单的解决方案(孩子们自己管理自己,我最喜欢的儿童解决方案!)会给Popen进程添加一个终止超时,所以如果它们在5分钟内没有收到“keep alive”(保持活动状态)的消息(或者您认为是正确的),那么它们将保存状态(如果合适)并终止?在

我猜gtk_main_quit()将是您用来终止事件循环的,但是如果我不在基础上,请替换which will terminate your child process=)另外,我猜gtk even循环可能有自己的计时器函数,它的实现与线程不同,但我想测试我发布的内容。在

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()

相关问题 更多 >