我设法使用this recipe at ActiveState: win-services-helper
将Python脚本作为服务安装。
为了充分利用它,我通过更换99 - 100行来包含我的程序的业务结束:
95 class Test(Service):
96 def start(self):
97 self.runflag=True
98 while self.runflag:
99 # My logging script
100 # goes here
101 def stop(self):
102 self.runflag=False
103 self.log("I'm done")
105
106 instart(Test, 'aTest', 'Python Service Test')
我的问题是,服务只记录一个条目,然后自行停止。然后我转到services.msc
,尝试再次启动该服务,然后Windows显示以下消息:
本地计算机上的Python服务测试服务已启动,然后停止。有些服务在没有工作要做时会自动停止,例如,性能日志和警报服务。
当我将它置于无限循环中时,我的服务怎么认为它无关?只有当我关闭计算机并在下次打开计算机时再次开始工作时它才会停止即使没有人登录也是如此。
注意:我的日志记录脚本使用对csv
的简单文件读/写。它不使用任何花哨的记录模块。
答案 0 :(得分:2)
我相信遇到错误时也会显示此消息。运行该服务的用户不可能没有在日志文件中写入的权限。您可以尝试创建该csv文件并设置访问权限,以便“Everyone”可以写入该文件。
答案 1 :(得分:1)
现在有效。感谢大家的见解!
配方由两个脚本组成:
winservice.py
winservice_test.py
在我之前的尝试中,我选择了一些我认为有用的线条。我可能错过了其中一些,因此它没有用。
我离开了winservice.py
。对于我的脚本的业务端,我将它放在winservice_test.py
中的循环结构中。
编写代码后,我转到命令行,浏览到存储两个脚本的位置,然后用
安装服务python winservice_test.py
现在可以通过services.msc
访问我的服务。默认情况下,它作为本地系统帐户运行,这会在注销时出现问题。该服务仍将继续,但由于该帐户没有对日志文件夹的写入权限,因此它将停止运行。
我修改了属性,以便它与我的用户帐户(对日志文件夹具有写入权限)一起运行。我的服务现在可以在注销后继续运行,只在关机时停止工作,并且即使没有任何人登录,也会在Windows启动后立即启动。
答案 2 :(得分:0)
当您确定服务停止时,您需要查看整个代码,并且可以使用其他工具(如python daemonize)来控制代码。