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 -t
opción de sysread
leer desde la your-command
salida con un tiempo de espera.
Tenga en cuenta que hace que your-command
la salida sea una tubería. Puede ser que your-command
comience 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-command
solucionarlo utilizando para restaurar el búfer de línea (si su comando usa stdio) o usarlo en zpty
lugar de coproc
falsificar una salida de terminal.
Con bash
, tendrías que confiar en dd
GNU timeout
si 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á zsh
o ksh93
porque $!
no contiene el pid de your-command
allí).
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