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)并且我需要因用户请求或因为过程已经运行太久了.一旦找到我要找的东西,我就会停止检查stdout临时文件.我将在外部进程停止并且工作线程终止之前将其清理干净.我需要stdin PIPE,以防我需要在子节点的stdin流中注入一些交互式的响应.
在我的主程序中,如果我的主python程序使用SIGTERM或SIGINT(Ctrl-C)终止(如果从shell运行),我为我设置一个SIGINT和SIGTERM处理程序来执行清理.
有没有人有一个坚实的2.x配方用于线程中的子信号处理?
ctypes sigprocmask等
任何帮助将非常感激.我只是在寻找一个“官方”配方或最好的黑客,如果一个甚至存在.
笔记
我正在使用受限制的Python构建.我必须使用2.7.3.第三方cmd是我没有源代码的程序 – 修改它是不可能的.