how to kill (or avoid) zombie processes with subprocess module

后端 未结 9 1221
悲&欢浪女
悲&欢浪女 2020-11-29 22:10

When I kick off a python script from within another python script using the subprocess module, a zombie process is created when the subprocess \"completes\". I am unable to

9条回答
  •  清歌不尽
    2020-11-29 22:57

    I'm not sure what you mean "I need to run my script with no_wait()", but I think this example does what you need. Processes will not be zombies for very long. The parent process will only wait() on them when they are actually already terminated and thus they will quickly unzombify.

    #!/usr/bin/env python2.6
    import subprocess
    import sys
    import time
    
    children = []
    #Step 1: Launch all the children asynchronously
    for i in range(10):
        #For testing, launch a subshell that will sleep various times
        popen = subprocess.Popen(["/bin/sh", "-c", "sleep %s" % (i + 8)])
        children.append(popen)
        print "launched subprocess PID %s" % popen.pid
    
    #reverse the list just to prove we wait on children in the order they finish,
    #not necessarily the order they start
    children.reverse()
    #Step 2: loop until all children are terminated
    while children:
        #Step 3: poll all active children in order
        children[:] = [child for child in children if child.poll() is None]
        print "Still running: %s" % [popen.pid for popen in children]
        time.sleep(1)
    
    print "All children terminated"
    

    The output towards the end looks like this:

    Still running: [29776, 29774, 29772]
    Still running: [29776, 29774]
    Still running: [29776]
    Still running: []
    All children terminated
    

提交回复
热议问题