Patch-ID: bash40-021
[bash.git] / examples / scripts / timeout
blobac8d88f4fe182f7b7a766f0f8f8f9c9a6192da1a
1 #Newsgroups: comp.unix.admin,comp.unix.solaris,comp.unix.shell
2 #From: gwc@root.co.uk (Geoff Clare)
3 #Subject: Re: timeout -t <sec> <unix command> (Re: How to give rsh a shorter timeout?)
4 #Message-ID: <EoBxrs.223@root.co.uk>
5 #Date: Fri, 13 Feb 1998 18:23:52 GMT
8 # Conversion to bash v2 syntax done by Chet Ramey <chet@po.cwru.edu
9 # UNTESTED
12 prog=${0##*/}
13 usage="usage: $prog [-signal] [timeout] [:interval] [+delay] [--] <command>"
15 SIG=-TERM       # default signal sent to the process when the timer expires
16 timeout=60      # default timeout
17 interval=15     # default interval between checks if the process is still alive
18 delay=2         # default delay between posting the given signal and
19                 # destroying the process (kill -KILL)
21 while :
23         case $1 in
24         --)     shift; break ;;
25         -*)     SIG=$1 ;;
26         [0-9]*) timeout=$1 ;;
27         :*)     EXPR='..\(.*\)' ; interval=`expr x"$1" : "$EXPR"` ;;
28         +*)     EXPR='..\(.*\)' ; delay=`expr x"$1" : "$EXPR"` ;;
29         *)      break ;;
30         esac
31         shift
32 done
34 case $# in
35 0)      echo "$prog: $usage" >&2 ; exit 2 ;;
36 esac
39         for t in $timeout $delay
40         do
41                 while (( $t > $interval ))
42                 do
43                         sleep $interval
44                         kill -0 $$ || exit
45                         t=$(( $t - $interval ))
46                 done
47                 sleep $t
48                 kill $SIG $$ && kill -0 $$ || exit
49                 SIG=-KILL
50         done
51 ) 2> /dev/null &
53 exec "$@"