Timeout in a Shell Script
Although GNU coreutils includes a timeout
command, sometimes that’s not
available. There are a lot of ham fisted approaches by very intelligent
people.
The “right” way to do this is with the ALRM
signal. That’s what it’s for. So
rather than reinvent the wheel, here’s a correctly working timeout function.
This works in at least bash
and zsh
.
cleanup () {
[[ -z $! ]] && kill -s TERM $!
sleep 1
[[ -z $! ]] && kill -s KILL $!
}
timeout () {
( sleep $1 ; kill -s ALRM $$ ) &
shift
"$@" &
wait $!
}
trap cleanup ALRM
timeout 5 sleep 7
In this case, timeout 5
executes with timeout of 5 seconds and sleep 7
is
the command to execute. This example will timeout. The timeout function will
return with 142
if the process timed out.