我有一个python cgi脚本,接受用户上传(通过sys.stdin.read)。 收到文件后(无论是成功还是失败),脚本需要进行一些清理。这在上传正确完成时工作正常,但是如果用户关闭客户端,则cgi脚本在服务器上被静默杀死,因此不会执行清理代码。如何强制脚本始终完成。
答案 0 :(得分:1)
您可以使用信号模块捕获退出信号。虽然没有尝试使用mod_python。
http://docs.python.org/library/signal.html
在文档中注意:
当信号在I / O操作期间到达时,I / O操作可能会在信号处理程序返回后引发异常。这取决于底层Unix系统关于中断系统调用的语义。
如果您没有从处理程序中进行sys.exit,则可能需要捕获损坏的管道和/或文件写入的I / O异常。
答案 1 :(得分:1)
剧本可能没有被默默杀死;你只是没有看到python引发的异常。我建议将整个脚本包装在try-except
中,并将任何异常写入日志文件。
这样,你可以看到真正发生的事情。 logging
模块是您的朋友。
答案 2 :(得分:0)
您可以使用atexit模块。
http://docs.python.org/library/atexit.html
来自文档:
atexit模块定义了一个用于注册清理功能的函数。这样注册的函数在正常的解释器终止时自动执行。
注意:当程序被信号杀死,检测到Python致命内部错误或调用os._exit()时,不会调用通过此模块注册的函数。
这是sys.exitfunc变量提供的功能的备用接口。