2016-01-23 73 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

相关问题