Quiero detectar cuando algún proceso está atascado, pero no me da ninguna pista al respecto. Todo lo que sé es que si no produce ningún resultado en un tiempo de espera determinado (digamos 30 segundos), significa que probablemente esté bloqueado.
Conozco el timeout
programa coreutils , pero se basa en el tiempo de salida completo del programa, no en la última línea de tiempo de salida. Me encantaría si algo como esto funcionara:
timeout --stdout --stderr 30s my-program
Entonces, ¿hay alguna manera de hacer eso? ¿Cómo puedo hacerlo?
Respuestas:
El código
Guarde esto como
tkill
(hágalo ejecutable y ajuste suPATH
si es necesario):Uso básico
El primer argumento (
30
aquí) es el tiempo de espera en segundos.Notas
tkill
esperasome_command
generar salida de texto (no binario).tkill
sondasstdout
del comando dado. Para incluirstderr
redirigirlo como en el último ejemplo avanzado a continuación.Uso avanzado
Estos son ejemplos válidos:
Use la sintaxis de Bash en estas citas.
Estado de salida
some_command
sale solo, su estado de salida se reutilizará como el estado de salida detkill
;tkill 5 true
vuelve0
;tkill 5 false
vuelve1
;tkill 5 "true; false"
vuelve1
.tkill
es interrumpido porSIGINT
oSIGTERM
entonces el estado de salida será143
.Fragmentos de código explicados
eval
hace posibles los ejemplos avanzados.tee
nos permite analizarstdin
mientras le pasamos una copiastdout
.read -t
es responsable de aplicar el tiempo de espera, su estado de salida se utiliza para determinar qué hacer a continuación.fuente
Entonces, básicamente algo como esto:
fuente
Ejecute el programa en segundo plano mientras copia la salida a un archivo. Después de 30 segundos, si el archivo está vacío, finalice el programa; de lo contrario, vuelva a ponerlo en primer plano.
fuente