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

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

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

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

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

谢谢,
标记

最佳答案

  • "Logging Off" MSDN page 说在注销时,
  • WM_QUERYENDSESSION 被发送到每个窗口[在当前桌面上];
  • CTRL_LOGOFF_EVENT 被发送到每个进程。
  • ejabberd service stops on user logoff/login 表明如果一个进程没有 CTRL_LOGOFF_EVENT 的处理程序,它可以终止。

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

    Twisted 有一个内部日志记录工具。使用它的一个例子是对 Twisted starting/stopping factory/protocol less noisy log messages 的回答。如果您使用过它,您就会看到“收到 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
    # ####################################################
    

    关于用户从 Windows XP 注销后,使用 Twisted 的 Python 应用程序停止运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9674277/

    10-16 19:06
    查看更多