将CherryPy服务器脚本作为Windows服务安装和启动(使用sc.exe)
我正在尝试将一个简单的 CherryPy 服务器安装并作为 Windows 服务启动。
这里是我的脚本:(为了简洁,删掉了一些行。手动在命令行执行时一切正常)
app = AdminMediaHandler(django.core.handlers.wsgi.WSGIHandler())
logged_app = TransLogger(app)
server = wsgiserver.CherryPyWSGIServer( ('127.0.0.1', 8632), logged_app, server_name='localhost', numthreads=20 )
try:
server.start()
except KeyboardInterrupt:
server.stop()
我使用 sc.exe
来安装和启动这个服务。安装过程没问题,但我似乎无法启动这个服务。
我使用的命令是:(注意路径中有空格,不过我用双引号处理了这个问题,而且 binPath
在命令行手动执行时可以正常工作)
> sc.exe create "ServiceName" binPath= "\"C:\Path to Python\python.exe\" \"C:\Path to CherryPy Script\cherryserver.py\""
> sc.exe start "ServiceName"
无论是通过 sc.exe
还是通过 services.msc
的图形界面来启动服务,我总是收到这个错误:
[SC] StartService FAILED 1053:
The service did not respond to the start or control request in a timely fashion.
根据我的理解,这个问题是因为 python.exe
没有实现 Windows 服务 API。
我不想使用 py2exe 将脚本转换成 .exe
文件。
我找到了一些建议,提到可以使用不同的工具来安装服务,而不是 sc.exe
,这些工具叫做 srvany.exe
和 instsrv.exe
。不过,我在 Win2K Resource Kit 网站 上找不到它们。
有没有人知道怎么成功地将这个 .py
文件安装并启动为 Windows 服务?
有没有人知道
3 个回答
我更喜欢用 nssm 来把普通脚本安装成服务。你可以把 nssm.exe 复制到 C:\Windows\system32 或者 C:\Windows\SysWOW64 这个文件夹,具体看你的系统是什么。这样一来,你就可以按照下面的方式来安装一个服务:
nssm install yourservicename
如果是一个 Python 脚本,你需要把应用程序的路径设置为你的 python.exe,而参数就是你的脚本本身。
还有一些常用的命令可以用来启动、停止或编辑你的服务:
nssm start yourservicename
nssm stop yourservicename
nssm edit yourservicename
CherryPy自带了一个可以作为Windows服务启动的模块。想知道怎么安装和运行,可以参考这个StackOverflow上的问题。你可能需要改变一下现在的做法(也就是直接把Django应用传给WSGIServer),改用cherrypy.tree.graft来处理。
最后我使用了 ServiceInstaller,也叫 SMaster,就像这个回答里说的那样。不过,那个回答里提供的链接坏掉了,我找不到能用的链接。我之前本地就有 srunner.exe
。
不过,还有一个问题需要解决,那就是 ServiceInstaller 不能处理路径中带有 空格 的文件。
所以,我用了老式的DOS路径格式来注册服务。
我没有注册 C:\Program Files\MyApp\python.exe
,而是注册了 C:\PROGRA~1\MyApp\python.exe
。