diff options
author | Florian Pritz <bluewind@server-speed.net> | 2011-05-21 23:37:23 +0200 |
---|---|---|
committer | Florian Pritz <bluewind@server-speed.net> | 2011-05-21 23:46:20 +0200 |
commit | c8538b8fbc96f1df22d0a21836ad55bf242fdfce (patch) | |
tree | 8f199127c1ea0aabdacac4aba1b9b588b024938e /timeoutrun | |
download | bootrun-c8538b8fbc96f1df22d0a21836ad55bf242fdfce.tar.gz bootrun-c8538b8fbc96f1df22d0a21836ad55bf242fdfce.tar.xz |
initial commit
Signed-off-by: Florian Pritz <bluewind@server-speed.net>
Diffstat (limited to 'timeoutrun')
-rw-r--r-- | timeoutrun | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/timeoutrun b/timeoutrun new file mode 100644 index 0000000..90f131e --- /dev/null +++ b/timeoutrun @@ -0,0 +1,47 @@ +#!/bin/bash +# +# The Bash shell script executes a command with a time-out. +# Upon time-out expiration SIGTERM (15) is sent to the process. If the signal +# is blocked, then the subsequent SIGKILL (9) terminates it. +# +# Based on the Bash documentation example. + +# Hello Chet, +# please find attached a "little easier" :-) to comprehend +# time-out example. If you find it suitable, feel free to include +# anywhere: the very same logic as in the original examples/scripts, a +# little more transparent implementation to my taste. +# +# Dmitry V Golovashkin <Dmitry.Golovashkin@sas.com> + +scriptName="${0##*/}" + +declare -i DEFAULT_TIMEOUT=60 +declare -i DEFAULT_INTERVAL=1 +declare -i DEFAULT_DELAY=2 + +# Timeout. +declare -i timeout=DEFAULT_TIMEOUT +# Interval between checks if the process is still alive. +declare -i interval=DEFAULT_INTERVAL +# Delay between posting the SIGTERM signal and destroying the process by SIGKILL. +declare -i delay=DEFAULT_DELAY + +# kill -0 pid Exit code indicates if a signal may be sent to $pid process. +( + ((t = timeout)) + + while ((t > 0)); do + sleep $interval + kill -0 $$ || exit 0 + ((t -= interval)) + done + + # Be nice, post SIGTERM first. + # The 'exit 0' below will be executed if any preceeding command fails. + kill -s SIGTERM $$ && kill -0 $$ || exit 0 + sleep $delay + kill -s SIGKILL $$ +) 2> /dev/null & + +exec "$@" |