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 timeoutprograma 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 suPATHsi es necesario):Uso básico
El primer argumento (
30aquí) es el tiempo de espera en segundos.Notas
tkillesperasome_commandgenerar salida de texto (no binario).tkillsondasstdoutdel comando dado. Para incluirstderrredirigirlo 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_commandsale solo, su estado de salida se reutilizará como el estado de salida detkill;tkill 5 truevuelve0;tkill 5 falsevuelve1;tkill 5 "true; false"vuelve1.tkilles interrumpido porSIGINToSIGTERMentonces el estado de salida será143.Fragmentos de código explicados
evalhace posibles los ejemplos avanzados.teenos permite analizarstdinmientras le pasamos una copiastdout.read -tes 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