Con zsh, podrías hacer:
zmodload zsh/system
coproc your-command
while :; do
sysread -t 10 -o 1 <&p && continue
if (( $? == 4 )); then
echo "Timeout" >&2
kill $!
fi
break
done
La idea es utilizar la -topción de sysreadleer desde la your-commandsalida con un tiempo de espera.
Tenga en cuenta que hace que your-commandla salida sea una tubería. Puede ser que your-commandcomience a almacenar en búfer su salida cuando no va a una terminal, en cuyo caso puede encontrar que no genera nada en un momento, sino solo debido a ese almacenamiento en búfer, no porque esté colgado de alguna manera.
Podría stdbuf -oL your-commandsolucionarlo utilizando para restaurar el búfer de línea (si su comando usa stdio) o usarlo en zptylugar de coprocfalsificar una salida de terminal.
Con bash, tendrías que confiar en ddGNU timeoutsi está disponible:
coproc your-command
while :; do
timeout 10 dd bs=8192 count=1 2> /dev/null <&${COPROC[0]} && continue
if (($? == 124)); then
echo Timeout >&2
kill "$!"
fi
done
En lugar de coproc, también podría usar la sustitución de procesos:
while :; do
timeout 10 dd bs=8192 count=1 2> /dev/null <&3 && continue
if (($? == 124)); then
echo Timeout >&2
kill "$!"
fi
done 3< <(your-command)
(eso no funcionará zsho ksh93porque $!no contiene el pid de your-commandallí).
Redirigiría STDOUT a un archivo y luego usaría la prueba de marca de tiempo de monit para reiniciar el proceso si el tiempo m del archivo es mayor que un umbral.
fuente