我试图获得一系列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似乎停止工作,它坚持最后一个查询并停止更新,后面没有任何逻辑。有时在一次运行之后,有时在三次之后,但从未达到五次运行。
任何建议都将不胜感激。