Run a process and kill it if it doesn't end within one hour Run a process and kill it if it doesn't end within one hour python python

Run a process and kill it if it doesn't end within one hour


The subprocess module will be your friend. Start the process to get a Popen object, then pass it to a function like this. Note that this only raises exception on timeout. If desired you can catch the exception and call the kill() method on the Popen process. (kill is new in Python 2.6, btw)

import timedef wait_timeout(proc, seconds):    """Wait for a process to finish, or raise exception after timeout"""    start = time.time()    end = start + seconds    interval = min(seconds / 1000.0, .25)    while True:        result = proc.poll()        if result is not None:            return result        if time.time() >= end:            raise RuntimeError("Process timed out")        time.sleep(interval)


There are at least 2 ways to do this by using psutil as long as you know the process PID.Assuming the process is created as such:

import subprocesssubp = subprocess.Popen(['progname'])

...you can get its creation time in a busy loop like this:

import psutil, timeTIMEOUT = 60 * 60  # 1 hourp = psutil.Process(subp.pid)while 1:    if (time.time() - p.create_time()) > TIMEOUT:        p.kill()        raise RuntimeError('timeout')    time.sleep(5)

...or simply, you can do this:

import psutilp = psutil.Process(subp.pid)try:    p.wait(timeout=60*60)except psutil.TimeoutExpired:    p.kill()    raise

Also, while you're at it, you might be interested in the following extra APIs:

>>> p.status()'running'>>> p.is_running()True>>>


I had a similar question and found this answer. Just for completeness, I want to add one more way how to terminate a hanging process after a given amount of time: The python signal library https://docs.python.org/2/library/signal.html

From the documentation:

import signal, osdef handler(signum, frame):    print 'Signal handler called with signal', signum    raise IOError("Couldn't open device!")# Set the signal handler and a 5-second alarmsignal.signal(signal.SIGALRM, handler)signal.alarm(5)# This open() may hang indefinitelyfd = os.open('/dev/ttyS0', os.O_RDWR)signal.alarm(0)          # Disable the alarm

Since you wanted to spawn a new process anyways, this might not be the best soloution for your problem, though.