2017-02-08 1 views
0

Ich habe ein bisschen ein Problem mit einem Komponententest; wo in der Einrichtung überprüfe ich, ob ein Prozess läuft, und wenn es nicht ist, verwende ich Popen, um es auszuführen.Zombie-Prozess beim Aufrufen von Popen und dann Kill()

In der teardown() Ich rufe myprocess.kill(), so bekomme ich einen sauberen Zustand für jeden Test.

Dies funktioniert nur beim ersten Mal; weil, wenn ich den Kill-Befehl für diesen Prozess anrufe; es endet im Zombie-Zustand (Z +); und das bedeutet, dass, um es loszuwerden, ich auch die Unit-Test-Klasse töten muss, da das Popen in der Setup-Phase des Testfalls entstanden ist.

Gibt es eine Möglichkeit, dies zu umgehen? Ich rufe den Test mit pytest auf und übergebe das Unit-Test-Python-Skript als Parameter.

class Mytest(unittest.TestCase) 

    running_process = ""  

    def setUp(self): 
     command = "~/myprocess" 
     self.running_process = Popen(command, shell=True, stdout=PIPE, stderr=STDOUT) 

    def test_tryprocess(self): 
     #do something 

    def test_tryprocess_again(self): 
     # do something else 

    def tearDown(self): 
     self.running_process.kill() 

Antwort

1

Den Schuldigen gefunden: Wenn ich Popen anrufe, rufe ich auch shell = True an. Dies wird eine Verbindung mit dem Prozess schaffen, so dass es hängen bleibt, bis auch die Shell getötet wird.

Um das Problem zu lösen, entfernen Sie die shell=True aus dem Anruf und es funktioniert gut.