home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk1.iso / altsrc / articles / 1000-1999 / 1676 < prev    next >
Internet Message Format  |  1990-12-27  |  2KB

  1. From: maart@cs.vu.nl (Maarten Litmaath)
  2. Newsgroups: comp.unix.questions,alt.sources
  3. Subject: Re: Timeout on shell command.
  4. Message-ID: <7321@star.cs.vu.nl>
  5. Date: 16 Aug 90 14:13:25 GMT
  6.  
  7. In article <3716@sactoh0.UUCP>,
  8.     jak@sactoh0.UUCP (Jay A. Konigsberg) writes:
  9. )...
  10. )command &                # execute in background
  11.  
  12. What if the command is supposed to run in the _foreground_?
  13. The following timeout shell script can be easily converted to a C program
  14. if desired.
  15. --------------------cut here--------------------
  16. #!/bin/sh
  17. # @(#)timeout 6.2 90/03/01 Maarten Litmaath
  18.  
  19. prog=`basename $0`
  20. usage="Usage: $prog [-signal] [timeout] [:interval] [+delay] [--] <command>"
  21.  
  22. SIG=-KILL    # default signal sent to the process when the timer expires,
  23.         # unless a delay option has been given: then it is -TERM
  24. sigopt=0
  25. timeout=60    # default timeout
  26. interval=15    # default interval between checks if the process is still alive
  27. delay=        # (if specified) the delay between posting the given signal and
  28.         # destroying the process (kill -KILL)
  29.  
  30. while :
  31. do
  32.     case $1 in
  33.     --)
  34.         shift
  35.         break
  36.         ;;
  37.     -*)
  38.         SIG=$1
  39.         sigopt=1
  40.         ;;
  41.     [0-9]*)
  42.         timeout=$1
  43.         ;;
  44.     :*)
  45.         EXPR='..\(.*\)'
  46.         interval=`expr x"$1" : "$EXPR"`
  47.         ;;
  48.     +*)
  49.         EXPR='..\(.*\)'
  50.         delay=`expr x"$1" : "$EXPR"`
  51.         case $sigopt in
  52.         0)
  53.             SIG=-TERM
  54.         esac
  55.         ;;
  56.     *)
  57.         break
  58.     esac
  59.     shift
  60. done
  61.  
  62. case $# in
  63. 0)
  64.     echo "$usage" >&2
  65.     exit 2
  66. esac
  67.  
  68. (
  69.     for t in $timeout $delay
  70.     do
  71.         while test $t -gt $interval
  72.         do
  73.             sleep $interval
  74.             kill -0 $$ || exit
  75.             t=`expr $t - $interval`
  76.         done
  77.         sleep $t
  78.         kill $SIG $$ && kill -0 $$ || exit
  79.         SIG=-KILL
  80.     done
  81. ) 2> /dev/null &
  82.  
  83. exec "$@"
  84. --
  85.    "UNIX was never designed to keep people from doing stupid things, because
  86.     that policy would also keep them from doing clever things."  (Doug Gwyn)
  87.