为什么这个Python服务在无限循环中仍然会自行停止?

3 投票
3 回答
3833 浏览
提问于 2025-04-16 05:31

我成功地把一个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 个回答

0

在你决定服务停止的时候,需要查看整个代码。你也可以使用其他工具,比如 Python 的 daemonize,来控制你的代码。

2

我觉得这个信息出现的时候,通常是遇到错误了。很有可能是运行这个服务的用户没有权限去写日志文件。你可以试着自己创建那个csv文件,然后设置权限,让“所有人”都能写入这个文件。

1

现在它可以正常工作了。感谢大家的建议!

这个过程包含了两个脚本:

  • winservice.py
  • winservice_test.py

在我之前的尝试中,我挑选了一些我认为有用的代码行,但可能漏掉了一些,所以没有成功。

我把winservice.py保持原样。为了实现我脚本的主要功能,我把它放在了winservice_test.py的一个循环结构里。

写完代码后,我打开命令行,找到这两个脚本存放的地方,然后用以下命令安装了服务:

python winservice_test.py

现在我可以通过services.msc访问我的服务。默认情况下,它以本地系统账户运行,这在注销时会出现问题。虽然服务仍然会继续运行,但会因为这个账户没有写入日志文件夹的权限而停止。

我修改了它的属性,让它以我的用户账户运行(这个账户有写入日志文件夹的权限)。现在我的服务在注销后依然可以运行,只有在关机时才会停止,并且即使没有人登录,Windows启动时它也会自动启动。

撰写回答