Kill a running subprocess call

后端 未结 5 1444
情歌与酒
情歌与酒 2020-11-28 12:08

I\'m launching a program with subprocess on Python.

In some cases the program may freeze. This is out of my control. The only thing I can do from the co

相关标签:
5条回答
  • 2020-11-28 12:42

    You can use two signals to kill a running subprocess call i.e., signal.SIGTERM and signal.SIGKILL; for example

    import subprocess
    import os
    import signal
    import time
    ..
    process = subprocess.Popen(..)
    ..
    # killing all processes in the group
    os.killpg(process.pid, signal.SIGTERM)
    time.sleep(2)
    if process.poll() is None:  # Force kill if process is still alive
        time.sleep(3)
        os.killpg(process.pid, signal.SIGKILL)
    
    0 讨论(0)
  • 2020-11-28 12:48

    Your question is not too clear, but If I assume that you are about to launch a process wich goes to zombie and you want to be able to control that in some state of your script. If this in the case, I propose you the following:

    p = subprocess.Popen([cmd_list], shell=False)
    

    This in not really recommanded to pass through the shell. I would suggest you ti use shell=False, this way you risk less an overflow.

    # Get the process id & try to terminate it gracefuly
    pid = p.pid
    p.terminate()
    
    # Check if the process has really terminated & force kill if not.
    try:
        os.kill(pid, 0)
        p.kill()
        print "Forced kill"
    except OSError, e:
        print "Terminated gracefully"
    
    0 讨论(0)
  • 2020-11-28 12:55

    Well, there are a couple of methods on the object returned by subprocess.Popen() which may be of use: Popen.terminate() and Popen.kill(), which send a SIGTERM and SIGKILL respectively.

    For example...

    import subprocess
    import time
    
    process = subprocess.Popen(cmd, shell=True)
    time.sleep(5)
    process.terminate()
    

    ...would terminate the process after five seconds.

    Or you can use os.kill() to send other signals, like SIGINT to simulate CTRL-C, with...

    import subprocess
    import time
    import os
    import signal
    
    process = subprocess.Popen(cmd, shell=True)
    time.sleep(5)
    os.kill(process.pid, signal.SIGINT)
    
    0 讨论(0)
  • 2020-11-28 12:59
    p = subprocess.Popen("echo 'foo' && sleep 60 && echo 'bar'", shell=True)
    p.kill()
    

    Check out the docs on the subprocess module for more info: http://docs.python.org/2/library/subprocess.html

    0 讨论(0)
  • 2020-11-28 13:00

    Try wrapping your subprocess.Popen call in a try except block. Depending on why your process is hanging, you may be able to cleanly exit. Here is a list of exceptions you can check for: Python 3 - Exceptions Handling

    0 讨论(0)
提交回复
热议问题