0

有没有办法让 CherryPy(在 :8080 上运行,它的唯一功能是作为 SIGUSR1 的侦听器)如果在一定秒数内没有被 ping 通,它会杀死一个进程?

当然,用于杀死进程的 Python 代码是没有问题的,只是 CherryPy 检测最后一次 ping 的方式,并不断将其与当前时间进行比较 - 如果在一定秒数内没有被 ping 过,则杀死一个进程。

请注意,如果 Javascript 正在执行 ping(通过setInterval()),CherryPy 代码中的无限循环将导致.ajax()请求挂起和/或超时,除非有一种方法可以.ajax()只执行 ping 而无需等待任何类型的响应。

感谢你们提供的任何提示!

石匠

4

1 回答 1

0

好的,所以答案是设置两个类,一个更新时间,另一个不断检查时间戳是否在 20 秒内没有更新。如果整个站点不是基于 CherryPy 构建的,那么在用户离开页面后终止进程时,这非常有用。在我的例子中,它只是坐在 :8080 上监听来自 Zend 项目的 JS ping。CherryPy 代码如下所示:

import cherrypy
import os
import time

class ProcKiller(object):

    @cherrypy.expose
    def index(self):
        global var 
        var = time.time()

    @cherrypy.expose
    def other(self):
        while(time.time()-var <= 20):
            time.sleep(1)
        print var
        os.system('pkill proc')     


cherrypy.quickstart(ProcKiller())

ping 的 JS 从字面上看很简单:

<script type="text/javascript">
function ping(){
    $.ajax({
       url: 'http://localhost:8080'
    });
 }
function initWatcher(){
    $.ajax({
       url: 'http://localhost:8080/other'
    });
 }

ping(); //Set time variable first
initWatcher(); //Starts the watcher that waits until the time var is >20s old
setInterval(ping, 15000); //Updates the time variable every 15s, so that while users are on the page, the watcher will never kill the process
</script>

希望这可以帮助其他人在用户离开页面后寻找类似的解决方案来处理杀戮!

石匠

于 2012-08-16T18:57:27.313 回答