【发布时间】:2013-02-27 09:44:01
【问题描述】:
Solaris 10 上的 Python 2.7.3
问题
- 当我的子进程存在内部分段错误(核心)问题或用户使用 SIGTERM 或 SIGKILL 从 shell 外部终止它时,我的主程序的信号处理程序会处理 SIGTERM(-15) 并且我的父程序退出。 这是真的吗?或者它是一个糟糕的 python 构建?
背景和代码
我有一个 python 脚本,它首先产生一个工作管理线程。工作者管理线程然后产生一个或多个工作者线程。我的主线程中还有其他无法阻止的事情。我的管理线程的东西和工作线程是坚如磐石的。我的服务运行了多年而没有重新启动,但是我们有这个subprocess.Popen 场景:
在工作线程的run方法中,我使用的是:
class workerThread(threading.Thread):
def __init__(self) :
super(workerThread, self).__init__()
...
def run(self)
...
atempfile = tempfile.NamedTempFile(delete=False)
myprocess = subprocess.Popen( ['third-party-cmd', 'with', 'arguments'], shell=False, stdin=subprocess.PIPE, stdout=atempfile, stderr=subprocess.STDOUT,close_fds=True)
...
我需要使用myprocess.poll() 来检查进程是否终止,因为我需要扫描atempfile 直到找到相关信息(文件可能> 1 GiB)并且我需要由于用户请求或终止进程因为进程运行时间太长了。一旦我找到我要找的东西,我将停止检查标准输出临时文件。我会在外部进程死后和工作线程终止之前清理它。我需要标准输入管道,以防我需要在孩子的标准输入流中注入对交互的响应。
在我的主程序中,我设置了一个 SIGINT 和 SIGTERM 处理程序来执行清理,如果我的主 python 程序以 SIGTERM 或 SIGINT(Ctrl-C) 终止(如果从 shell 运行)。
有没有人在线程中处理子信号的可靠 2.x 配方? ctypes sigprocmask 等
任何帮助将不胜感激。我只是在寻找“官方”食谱或BEST hack,如果有的话。
备注
我正在使用受限版本的 Python。我必须使用 2.7.3。第三方 cmd 是我没有源代码的程序 - 无法修改。
【问题讨论】:
-
欢迎来到 SO。即使我没有给您答案,我还是建议您删除大部分“文字墙”。这可能会吓跑潜在的回答者。至少,把它分成几个部分。
-
感谢您的回复。不知道如何编辑它并获得我想要传达的内容。
-
我对您的问题进行了编辑,以帮助使其更具可读性。您不必更改您所写的内容,但将其分成小节会很有帮助。
-
另外,为了帮助您让其他人对您的帖子感兴趣,我建议您阅读this post about asking good questions和this post about writing great (attractive) titles.
-
感谢您的帮助。我绝对是新手。我去看看帖子
标签: multithreading python-2.7 signals subprocess parent-child