使用Twisted的Python应用程序在用户注销Windows XP后停止运行

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

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

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

我倾向于认为Windows XP和Twisted库的某些东西导致应用程序终止或停止运行.特别是,我认为反应堆代码中可能存在导致应用程序代码停止运行的问题.但是,我无法证实这一点.

有没有其他人看到这个或有什么可能导致这个的想法?

谢谢,
标记

最佳答案 >
“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
# ####################################################
点赞