35 lines
1.1 KiB
Python
35 lines
1.1 KiB
Python
##########################################################################
|
|
# Copyright (c) 2009-2016 ETH Zurich.
|
|
# All rights reserved.
|
|
#
|
|
# This file is distributed under the terms in the attached LICENSE file.
|
|
# If you do not find this file, copies can be found by writing to:
|
|
# ETH Zurich D-INFK, Universitaetstr 6, CH-8092 Zurich. Attn: Systems Group.
|
|
##########################################################################
|
|
|
|
from threading import Timer
|
|
|
|
# Wait for Popen instance p for timeout seconds and terminate/kill it after
|
|
# the timeout expires
|
|
# Adapted from
|
|
# http://stackoverflow.com/questions/1191374/using-module-subprocess-with-timeout
|
|
def wait_or_terminate(p, timeout=5):
|
|
|
|
# Kill process if terminate doesn't exit in 1 second
|
|
def cleanup(x):
|
|
k = lambda y: y.kill()
|
|
timer2 = Timer(1, k, [x])
|
|
try:
|
|
timer2.start()
|
|
x.terminate()
|
|
finally:
|
|
timer2.cancel()
|
|
|
|
# Termiate process if it doesn't voluntarily exit in `timeout` seconds
|
|
timer = Timer(timeout, cleanup, [p])
|
|
try:
|
|
timer.start()
|
|
p.wait()
|
|
finally:
|
|
timer.cancel()
|