2016-07-27 39 views
0

我試圖停止一個服務器,當父進程被一個cntrl-D(stdin上的EOF)殺死時,這是一個子進程。我嘗試了很多方法,包括讀取子進程中的stdin,但會阻止所有鍵盤輸入。當父進程遇到EOF時,是否有辦法終止子進程?在控制-D上退出子進程?

這個創建通過subprocess.Popen

輪詢的子EOF Python中的子:

self.t = threading.Thread(target=self.server.serve_forever) 
self.t.start() 
# quit on cntrl-d (EOF) 
while True: 
    if len(sys.stdin.readline()) == 0: 
     self.stop() 

def stop(self): 
    manager.save() 
    # shutdown bottle 
    self.server.shutdown() 
    # close socket 
    self.server.server_close() 
    self.t.join() 
    sys.exit() 
+0

讓父母處理給孩子一個信號,表示該退出了。 –

+0

@thatotherguy當用戶用控件-d強制退出父進程時不起作用,那裏沒有信號傳播。 –

+0

Ctrl-D不是強制退出。在你的代碼片段中,你似乎已經明確地編碼以檢測eof並因爲而退出。只要發信號通知小孩,它應該作爲其中的一部分退出。與Python的線程事件。 –

回答

0

使用os.getppid()的@thatotherguy的建議,這裏是新工作的解決方案當它由父母孤兒時結束子過程(即,當父母發生控制-D並且在父母關閉而沒有發信號通知孩子)

self.t = threading.Thread(target=self.server.serve_forever) 
self.t.start() 
# quit on cntrl-d (EOF) 
if os.getppid() != 1: 
    while True: 
     if os.getppid() == 1: 
      self.stop() 
     else: 
      time.sleep(1)