的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