30 lines
861 B
Text
30 lines
861 B
Text
|
|
#!/bin/sh
|
||
|
|
|
||
|
|
# Author: P@draigBrady.com
|
||
|
|
# V1.0 : Nov 3 2006
|
||
|
|
#
|
||
|
|
# Execute a command with a timeout.
|
||
|
|
# If the timeout occurs the exit status is 128
|
||
|
|
#
|
||
|
|
# Note there is an asynchronous equivalent of this
|
||
|
|
# script packaged with bash (under /usr/share/doc/ in my distro),
|
||
|
|
# which I only noticed after writing this.
|
||
|
|
|
||
|
|
if [ "$#" -lt "2" ]; then
|
||
|
|
echo "Usage: `basename $0` timeout_in_seconds command" >&2
|
||
|
|
echo "Example: `basename $0` 2 sleep 3 || echo timeout" >&2
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
cleanup()
|
||
|
|
{
|
||
|
|
kill %1 2>/dev/null #kill sleep $timeout if running
|
||
|
|
kill %2 2>/dev/null && exit 128 #kill monitored job if running
|
||
|
|
}
|
||
|
|
|
||
|
|
set -m #enable job control
|
||
|
|
trap "cleanup" 17 #cleanup after timeout or command
|
||
|
|
timeout=$1 && shift #first param is timeout in seconds
|
||
|
|
sleep $timeout& #start the timeout
|
||
|
|
"$@" #start the job
|