Python,CherryPy,Windows服务和BackgroundTask - 不按预期重复的任务

时间:2014-06-26 06:29:29

标签: python windows service background cherrypy

我试图获得一系列python脚本,每60秒更新一次,并通过CherryPy在Windows上提供JSON(用于WMI功能)并作为Windows服务进行管理。简而言之,如果我在服务外部的控制台中运行代码,则任务会定期从BackgroundTask类执行,而不会出现问题。一旦完成在CherryPy Windows服务中,它们会执行一次或两次,然后停止工作(JSON停止更改)。

这是ActiveState Python 2.7(社区)上的CherryPy 3.3.0。

运行下面的代码,脚本可以运行(导入snmp是每60秒运行一次的python脚本,它以这种形式运行)。

import cherrypy
from cherrypy.lib.static import serve_file
import cherrypy.process.plugins
import win32serviceutil
import win32service
import win32event
import os
import snmp

class myserver():
    @cherrypy.expose
    def snmp_ajax(self):
        cherrypy.response.headers['Content-Type'] = 'application/json'
        return snmp.json

def snmp_callback():
    global snmp_data
    snmp.generate_json(snmp_data)

snmp_data = cherrypy.process.plugins.BackgroundTask (60, snmp_callback)
snmp_data.start()

cherrypy.tree.mount(myserver(), '/', config=CONFIG)
cherrypy.config.update({
        'global':{
            'server.socket_host': '0.0.0.0',
            'server.socket_port': 8989,
        'log.screen': False,
            'engine.autoreload.on': False,
            'engine.SIGHUP': None,
            'engine.SIGTERM': None
        }                
    }) 

cherrypy.engine.start()

现在,要将其作为Windows服务运行,只需将下方的cherrypy代码放在CherryPyService类中,如下所示:

class CherryPyService(win32serviceutil.ServiceFramework):
    """NT Service."""

    _svc_name_ = "MyService"
    _svc_display_name_ = "My Service"

    def SvcDoRun(self):
        cherrypy.tree.mount(myserver(), '/', config=CONFIG)         
        cherrypy.config.update({
                'global':{
                    'server.socket_host': '0.0.0.0',
                    'server.socket_port': 8989,
                    'log.screen': False,
                    'engine.autoreload.on': False,
                    'engine.SIGHUP': None,
                    'engine.SIGTERM': None
                }                
            }) 
        cherrypy.engine.start() 
        cherrypy.engine.block()

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        cherrypy.engine.exit()

        self.ReportServiceStatus(win32service.SERVICE_STOPPED)

if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(CherryPyService)

然而,一旦它被包装在CherryPyService类中,BackgroundTask似乎停止工作,它坚持最后一个查询并停止更新,后面没有任何逻辑。有时在一次运行之后,有时在三次之后,但从未达到五次运行。

任何建议都将不胜感激。

0 个答案:

没有答案