为什么这个Python服务在无限循环中仍然会自行停止?
我成功地把一个Python脚本安装成了一个服务,使用的是ActiveState上的这个方法:win-services-helper
。
为了能更好地使用它,我把我程序的主要部分放进来了,替换了第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
文件,并没有使用任何复杂的日志模块。
3 个回答
在你决定服务停止的时候,需要查看整个代码。你也可以使用其他工具,比如 Python 的 daemonize,来控制你的代码。
我觉得这个信息出现的时候,通常是遇到错误了。很有可能是运行这个服务的用户没有权限去写日志文件。你可以试着自己创建那个csv文件,然后设置权限,让“所有人”都能写入这个文件。
现在它可以正常工作了。感谢大家的建议!
这个过程包含了两个脚本:
winservice.py
winservice_test.py
在我之前的尝试中,我挑选了一些我认为有用的代码行,但可能漏掉了一些,所以没有成功。
我把winservice.py
保持原样。为了实现我脚本的主要功能,我把它放在了winservice_test.py
的一个循环结构里。
写完代码后,我打开命令行,找到这两个脚本存放的地方,然后用以下命令安装了服务:
python winservice_test.py
现在我可以通过services.msc
访问我的服务。默认情况下,它以本地系统账户运行,这在注销时会出现问题。虽然服务仍然会继续运行,但会因为这个账户没有写入日志文件夹的权限而停止。
我修改了它的属性,让它以我的用户账户运行(这个账户有写入日志文件夹的权限)。现在我的服务在注销后依然可以运行,只有在关机时才会停止,并且即使没有人登录,Windows启动时它也会自动启动。