的Python 2.7.3在Solaris 10上防止子线程死亡时线程subprocess.popen终止我的主脚本?
问题
- 当我的子进程有一个内部分割故障(核心)发行或用户通过一个外部SIGTERM或SIGKILL,杀死它从我的壳主程序的信号处理程序处理一个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),并且由于用户请求或流程运行时间过长,我需要终止进程。一旦找到我正在查找的内容,我将停止检查stdout临时文件。在外部进程终止之后以及工作线程终止之前,我将对其进行清理。我需要stdin PIPE,以防我需要在孩子的标准输入流中注入一些交互响应。
在我的主程序中,如果我的主python程序以SIGTERM或SIGINT(Ctrl-C)结尾(如果从shell运行),我将为SIGIN和SIGTERM处理程序执行清理。
有没有人有线程中的子信号处理固体2.x配方? ctypes sigprocmask等
任何帮助将不胜感激。我只是在寻找一个'官方'配方或BEST hack,如果有的话。
注意
我使用Python的限制版本。我必须使用2.7.3。第三方-cmd是我没有源代码的程序 - 修改它是不可能的。
欢迎来到SO。尽管我没有给你答案,但我建议你删除大部分“文字墙”。这可能会吓跑潜在的回答者。至少,将它分成几部分。 – xxmbabanexx 2013-03-12 01:34:00
感谢您的回复。不知道如何编辑它,并得到我想要传达的信息。 – whistler 2013-03-12 01:43:39
我编辑了您的问题,以帮助使其更具可读性。你不需要改变你写的内容,但是将它分成小节是有帮助的。 – xxmbabanexx 2013-03-12 01:47:35