【问题标题】:Python application using Twisted stops running after user logs off of Windows XP用户从 Windows XP 注销后,使用 Twisted 的 Python 应用程序停止运行
【发布时间】:2012-03-29 06:40:21
【问题描述】:

我继承了一个使用 Twisted Python 库的项目。该应用程序在用户从 Windows XP 注销后终止。

Python 代码已使用 bbfreeze 转换为可执行文件。此外,使用 instsrv.exe 和 srvany.exe 将 bbfreeze 生成的可执行文件注册为 Windows 服务。

我从 Twisted 网站上获取了一个简单的聊天示例,并从 bbfreeze 创建了一个可执行文件,并使用 instsrv 和 srvany 注册了它,但出现了同样的问题:用户注销后可执行文件停止运行。

我倾向于认为 Windows XP 和 Twisted 库的某些原因导致应用程序终止或停止运行。特别是,我认为可能是反应器代码中的某些内容导致应用程序代码停止运行。但是,我无法证实这一点。

有没有其他人看到过这种情况或对可能导致这种情况的原因有任何想法?

谢谢, 标记

【问题讨论】:

    标签: python windows-services twisted


    【解决方案1】:

    根据“我也可以用一个简单的聊天示例来重现这个”评论判断,Twisted 是罪魁祸首。互联网上的人们确实报告说 Twisted 服务有时会以这种方式失败:Re: SIGBREAK on windows

    Twisted 有一个内部日志记录工具。使用它的一个例子是在Twisted starting/stopping factory/protocol less noisy log messages 的回答中。如果您使用它,您就会看到“received SIGBREAK...”消息指向根本原因。


    顺便说一句,我使用如下代码在我的脚本中记录未处理的异常。如果脚本要在无人看管的情况下运行(或由您诊断问题的其他人运行:^),这总是一个好主意。

    # set up logging #####################################
    import sys,os,logging
    logfile = os.path.splitext(os.path.basename(sys.argv[0]))[0]+".log"
    logging.basicConfig(\
        format='%(asctime)s %(levelname)-8s %(message)s',\
        filename=logfile,\
        level=logging.DEBUG)
    l = logging.getLogger()
    #to avoid multiple copies after restart from pdb prompt
    if len(l.handlers)<=1: l.addHandler(logging.StreamHandler(sys.stdout))
    #hook to log unhandled exceptions
    def excepthook(type,value,traceback):
        logging.exception("Unhandled exception occured",exc_info=(type,value,traceback))
        old_excepthook(type,value,traceback)
    old_excepthook = sys.excepthook
    sys.excepthook = excepthook
    # ####################################################
    

    【讨论】:

    • Twisted 本身没有任何特殊代码来响应 ivan_pozdeev 在此答案中提到的特定于 Windows 的事件。不过,win32eventreactor 将启动 Windows 消息循环 - 这是否重要,我不知道。
    • 我确实在没有 bbfreeze 的情况下尝试过这个,但问题仍然存在。我也可以用一个简单的chat sample 重现这个。
    • 好。现在我们知道 Twisted 是罪魁祸首。感谢您提供的示例,如果 Google 失败,这对于进一步挖掘这一点非常宝贵。目前,它没有:请参阅上面的更新。
    • 是的,是 SIGBREAK 导致了问题。我打开了日志记录并确认。如果您指定 reactor.run(False),则禁用信号处理,并且在注销 Windows XP 时服务不再终止。感谢您的帮助。
    猜你喜欢
    • 2012-07-20
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 2019-09-20
    • 2010-09-24
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多