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

Mar*_*k G 5 python windows-services twisted

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

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

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

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

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

谢谢,马克

iva*_*eev 2

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

Twisted 有一个内部日志记录工具。使用它的一个例子是在Twisted Starting/Stopping Factory/Protocol less Noisy Log messages的回答中。如果您使用过它,您可能已经看到了指向根本原因的“ receive 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
# ####################################################
Run Code Online (Sandbox Code Playgroud)