2017-12-24 4 views
0

the popular answers to this question Nach und die Anweisungen here habe ich den Code unten in Python 3:Python 3: subprocess verursacht Zombies

p1    = subprocess.Popen(["ps", "-e", "-o", "pcpu,args"],   stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    p2    = subprocess.Popen(["cut", "-c", "-132"], stdin=p1.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    p3    = subprocess.Popen(["awk", "NR>2"],   stdin=p2.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    p4    = subprocess.Popen(["sort", "-nr"],   stdin=p3.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    p5    = subprocess.Popen(["head", "-10"],   stdin=p4.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    ps,err   = p5.communicate() 
    psout    = str(ps, 'utf-8') 

Dieser Code wird jede Minute oder so in einer Schleife aufgerufen. Im Gegensatz zu dem, was man mir glauben gemacht hat, schafft das immer noch Zombies. Was mache ich falsch?

EDIT: Die Zombies beim Ausführen des Codes:

$ ps -eo pid,ppid,state,cmd | awk '$3 == "Z"' 
14441 11232 Z [ps] <defunct> 
14442 11232 Z [cut] <defunct> 
14445 11232 Z [sort] <defunct> 
+0

Fügen Sie auch die entsprechende 'ps'-Ausgabe hinzu. – heemayl

+2

Ummm ... Ich meinte eigentlich die relevanten Zombie ('Z') Prozesse. Hier 'ps -eo pid, ppid, state, cmd | awk '$ 3 == "Z"' – heemayl

+0

Ahum. Mein Fehler. Die letzte Änderung wurde entsprechend geändert. – Mausy5043

Antwort

0

Sie müssen communicate() für alle Teilprozesse für die Nutzung von "nicht mehr existierenden Prozesse loszuwerden.