基于python的Windows服务无法启动,未返回错误

2024-03-28 11:25:06 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么要问这个问题

作为使用windows服务编程的新手,我和一位同事无法通过使用netstart命令启动我们的服务。我们最终发现了一个允许服务启动的问题,但我不理解为什么我们的解决方案有效,我相信其他人也可能遇到这个问题,因此我发布了一个问题和答案,其中包括我们如何解决我们的情况,我希望其他更有经验和知识的人能够提供更完整的答案

我真正想回答的问题

为什么windows服务,特别是基于python的服务,将无法启动,但不会返回错误

我们必须克服的这个问题中最困难的部分是没有返回错误,我们查看了事件日志、使用netstart命令的命令提示符,但是没有需要的错误信息

问题详情

在尝试基于python模块创建windows服务时出现了问题,我们按照here提供的方法安装了使用python模块的windows服务

像这样启动服务是有效的(更多关于运行here

python service_definition.py debug

service_defininition.py中的代码来自上面链接中的示例,如下所述

import time
import random
from pathlib import Path
from SMWinservice import SMWinservice
import cress
from cress import server_interface
import sys 

class server_interface_backgndproc(SMWinservice):
    _svc_name_ = "server_interface_backgndproc"
    _svc_display_name_ = "CrowdRender SIP"
    _svc_description_ = "CrowdRender Server Interface Process"

    def start(self):
        self.isrunning = True
        sys.argv.append(["--",
                    # "--cr_session_type", 'agent',
                    "--cr_cress_mode", "SIP",
                    ])


    def stop(self):
        self.isrunning = False

    def main(self):
        i = 0
        ## while self.isrunning:
        server_interface.CRMachineManager()
       returns
        #while self.isrunning:


if __name__ == '__main__':
    server_interface_backgndproc.parse_command_line()

当使用net start“服务名称”或使用task manager中的“服务”面板启动服务时,服务未启动。使用net start时,我们得到以下输出:

net start 'service name'

Windows could not start the 'service name' service on Local Computer. 
The service did not return an error. 
This could be an internal Windows error or an internal service error. 
If the problem persists, contact your system administrator.


Tags: namefromimportselfserverwindowsdefservice
1条回答
网友
1楼 · 发布于 2024-03-28 11:25:06

要明确的是,我在回答我的问题时,详细说明了是什么原因导致了错误以及我们如何纠正错误。这可能不是最好的答案,因为它关注的是特定的原因,没有详细说明从windows服务报告错误(或不报告错误)所涉及的机制,也没有说明调试错误的最佳方法

我们发现了什么

与net start'service name'命令的输出相反,实际上出现了一些错误,但没有报告(或返回)

我们在代码中解决了这个问题(在我的书中,一个很好的经验法则是,大多数情况下,代码的不良行为是您自己的错,而不是其他人的xD),方法是在代码中加入一些好的旧日志语句,以显示在日志停止之前我们在程序中所做的工作。 这是一个真正的问题,我们无法知道问题在我们的代码库中的什么地方。幸运的是,它在前100行左右

下面是我们发现失败的代码部分

#Setup signal handling
signal.signal(signal.SIGTERM, self.handle_signal)

一旦我们删除了SIGTERM的信号处理程序的注册,该服务就可以使用netstart命令完美地工作

在另一个模块中,我们也发现了相同的问题

atexit.register(self.shutdown)

这两种情况的处理程序都会关闭网络套接字并销毁python日志模块的实例。在这两种情况下,删除注册这些处理程序的调用修复了我们的问题,并允许服务运行

因此,在我们的例子中,我们有一个解决问题的办法,但不能回答为什么会发生这种情况的主要问题。我们只能假设windows抛出错误,因为它不支持我们的模块注册自己的信号处理程序,或者在处理程序中调用的函数有问题

第二个似乎不太可能,因为这些处理人员已经在生产中工作了多年。第一个选项似乎是合理的,因为信号处理程序可能会通过永不返回来阻止停止服务的尝试,也许MS不喜欢这样。不确定

总之,如果您在windows中编写服务并使用python,请注意使用信号处理,因为它导致我们的代码失败,而不知道问题出在哪里,并导致停机,而我们将代码平分以查找问题出在哪里

我希望其他对windows服务系统的内部机制有更多了解的人能够评论或回答主要问题,即为什么服务无法启动且不返回错误

相关问题 更多 >