2016-01-23 38 views
0

我創建了一個類來啓動一些程序並在我完成任務後終止。 但似乎流連忘返。它具有設置和拆卸功能以及存儲過程的變量。啓動子流程並在完成時保存以殺死

現在我不在乎stdout & stderr。我只是認爲我需要包括這一點。

class ServerClient(object): 

    def __init__(self): 
     self.server_process = None 
     self.client_process = None 

    def setUp(self): 
     self.server_process = subprocess.Popen(
       ['python', 'servlet.py'], 
       stdout=subprocess.PIPE, 
       stderr=subprocess.STDOUT, 
     ) 
     self.client_process = subprocess.Popen(
       ['python', 'client.py'], 
       stdout=subprocess.PIPE, 
       stderr=subprocess.STDOUT, 
     ) 
     time.sleep(2) 

    def tearDown(self): 
     if self.server_process is not None: 
      try: 
       print "Killing Server" 
       self.server_process.terminate() 
       self.server_process.wait() 
      except OSError: 
       pass 
      self.server_process = None 
     if self.client_process is not None: 
      try: 
       print "Killing Client" 
       self.client_process.terminate() 
       self.client_process.wait() 
      except OSError: 
       pass 
      self.client_process = None 

if __name__ == '__main__': 
    sc = ServerClient() 
    sc.setUp() 
    # Do stuff 
    sc.tearDown() 
+0

你如何使用你的課堂?它在哪裏掛? – Daniel

+0

如果在管道的另一端沒有閱讀器,則該過程將一直等到存在。您不顯示任何讀取管道的代碼。 – cdarke

+0

我在編輯中回答了上述兩個Qns。 – user3480774

回答

1

(在POSIX OS上)terminate()向進程發送SIGTERM。嘗試

import os 
import signal 

os.kill(self.server_process.pid, signal.SIGTERM) 
os.kill(self.server_process.pid, signal.SIGTERM) 

如果服務器或客戶端預計將產生進程,則必須調用不同POPEN和使用os.killpg。

self.server_process = subprocess.Popen(
    ['python', 'server.py'], 
    stdout=subprocess.PIPE, 
    stderr=subprocess.STDOUT, 
    preexec_fn=os.setpgrp 
) 

os.killpg(os.getpgid(self.server_process.pid), signal.SIGTERM) 
+0

我想說,這種行爲不是Linux特有的。它基於POSIX API,因此可以在廣泛的系統中得到支持(主要是類似unix的,但不僅是) – user3159253

相關問題