Esta respuesta al comando de línea de comando para matar automáticamente un comando después de un cierto período de tiempo
propone un método de 1 línea para agotar el tiempo de espera de un comando de ejecución larga desde la línea de comando bash:
( /path/to/slow command with options ) & sleep 5 ; kill $!
Pero es posible que un comando de "ejecución prolongada" finalice antes del tiempo de espera. (Llamémoslo un comando "típicamente de larga ejecución pero a veces rápido", o tlrbsf por diversión).
Entonces, este ingenioso enfoque de 1 línea tiene un par de problemas. Primero, el sleep
no es condicional, por lo que establece un límite inferior indeseable en el tiempo que tarda la secuencia en terminar. Considere 30s o 2m o incluso 5m para dormir, cuando el comando tlrbsf termine en 2 segundos, muy indeseable. En segundo lugar, el kill
es incondicional, por lo que esta secuencia intentará matar un proceso que no se ejecuta y quejarse al respecto.
Entonces...
¿Hay alguna manera de agotar el tiempo de espera de un comando que suele ser de larga duración pero a veces rápido ( "tlrbsf" ) que
- tiene una implementación bash (la otra pregunta ya tiene respuestas de Perl y C)
- terminará en el primero de los dos: tlrbsf programa o tiempo de espera transcurrido
- no matará procesos no existentes / no en ejecución (u, opcionalmente: no se quejará de una mala eliminación)
- no tiene que ser un trazador de líneas
- puede ejecutarse bajo Cygwin o Linux
... y, para obtener puntos de bonificación, ejecuta el comando tlrbsf en primer plano y cualquier 'suspensión' o proceso adicional en segundo plano, de modo que el stdin / stdout / stderr del tlrbsf comando se pueda redirigir, como si hubiera sido correr directamente?
Si es así, por favor comparta su código. Si no, por favor explica por qué.
He pasado un tiempo tratando de hackear el ejemplo antes mencionado, pero estoy llegando al límite de mis habilidades de bash.
timeout
utilidad gnu ?
timeout
¡es genial! incluso puede usar con múltiples comandos (secuencia de comandos de varias líneas): stackoverflow.com/a/61888916/658497