1

Following the popular answers to this question and the instructions here I created the code below in python 3:

  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')

This code is called every minute or so in a loop. Contrary to what I was led to believe this still creates zombies. What am I doing wrong?

EDIT: The zombies when running the code:

$ ps -eo pid,ppid,state,cmd | awk '$3 == "Z"'
14441 11232 Z [ps] <defunct>
14442 11232 Z [cut] <defunct>
14445 11232 Z [sort] <defunct>
Mausy5043
  • 906
  • 2
  • 17
  • 39

1 Answers1

2

You need to use communicate() for all subprocesses to get rid of 'defunct' processes.

Maurice Meyer
  • 17,279
  • 4
  • 30
  • 47