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

Я ответил на оба из вышеперечисленных вопросов в редакциях. – user3480774

ответ

1

(On 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-like, но не только) – user3159253