Mata un proceso si se queda en silencio por un cierto tiempo


9

Tengo una utilidad que tiene el desagradable hábito de quedarse callado y permanecer allí, ya sé cuánto tiempo lleva en el proceso, así que lo uso timeoutpara combatir esto, pero a veces lo hace antes de ese momento. ¿Existe una herramienta similar a la timeoutque matará el proceso si deja de dirigir la salida a stdout?

Respuestas:


8

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í).


1
¡Hola! Gracias, ¿es posible que puedas comentar esto para que pueda entender lo que está haciendo?
Benjojo

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.