| #!/bin/sh | |
| # | |
| # Program: TimedExec.sh | |
| # | |
| # Synopsis: This script is a watchdog wrapper. It runs the specified program | |
| # but times out if it does not complete in the allocated time frame. | |
| # Syntax: ./TimedExec.sh <timeout> <dir> <program> <args...> | |
| # | |
| if [ $# -lt 3 ]; then | |
| echo "./TimedExec.sh <timeout> <dir> <program> <args...>" | |
| exit 1 | |
| fi | |
| PARENT="" | |
| if [ "$1" = "-p" ]; then | |
| PARENT=$2; shift; shift; | |
| fi | |
| TIMEOUT=$1 | |
| DIR=$2 | |
| shift 2 | |
| if [ -z "$PARENT" ]; then | |
| # Start a watchdog process | |
| $0 -p $$ $TIMEOUT $* & | |
| cd $DIR | |
| exec "$@" | |
| else | |
| # Sleep for a specified time then wake up to kill the parent process. | |
| exec > /dev/null 2>&1 | |
| SEC=0 | |
| while [ $SEC -lt $TIMEOUT ]; do | |
| sleep 1 | |
| # Check if parent has completed. | |
| kill -0 $PARENT 2>/dev/null | |
| if [ $? -eq 1 ]; then | |
| exit 0 | |
| fi | |
| SEC=$(($SEC + 1)) | |
| done | |
| kill $PARENT && (sleep 2; kill -1 $PARENT) && (sleep 2; kill -9 $PARENT) | |
| fi | |
| exit 0 |