Antecedentes:
Estoy escribiendo un script de prueba para una pieza de software de biología computacional. El software que estoy probando puede tardar días o incluso semanas en ejecutarse, por lo que tiene una funcionalidad de recuperación incorporada, en caso de fallas del sistema o fallas de energía.
Estoy tratando de descubrir cómo probar el sistema de recuperación. Específicamente, no puedo encontrar una manera de "bloquear" el programa de manera controlada. Estaba pensando de alguna manera cronometrar una instrucción SIGKILL para que se ejecute después de cierto tiempo. Probablemente esto no sea lo ideal, ya que no se garantiza que el caso de prueba funcione siempre a la misma velocidad (se ejecuta en un entorno compartido), por lo que sería difícil comparar los registros con la salida deseada.
Este software imprime una línea para cada sección de análisis que completa.
Pregunta:
Me preguntaba si había una manera buena / elegante (en un script de shell) para capturar la salida de un programa y luego matar el programa cuando el programa genera una línea / # de líneas dada.
Respuestas:
Un script de envoltura como este es un enfoque estándar. La secuencia de comandos ejecuta el programa en segundo plano y luego realiza un bucle, verificando el archivo de registro cada minuto en busca de alguna cadena. Si se encuentra la cadena, se elimina el programa en segundo plano y se cierra el script.
fuente
Si su programa terminará en SIGPIPE (que es la acción predeterminada), debería ser suficiente para canalizar la salida en un lector que saldrá al leer esa línea.
Entonces podría ser tan simple como
Si desea suprimir la salida predeterminada, use
Del mismo modo, si uno quiere detenerse después de un cierto número de líneas, podría usar la cabeza en lugar de sed, por ejemplo
La hora exacta de a la que se produce la matanza no dependerá del comportamiento de amortiguación del terminal como stardt sugiere en los comentarios.
fuente
sed
finalice. OP dice "Este software imprime una línea para cada sección de análisis que completa". ¡Puede significar que el programa completará una sección adicional! Prueba de concepto:{ echo 1; sleep 3; >&2 echo peekaboo; sleep 3; echo 2; } | sed -e '/1/q'
. Mira esta respuesta . Posible solución:( program & ) | sed -e '/Suitable text from the line/q'; killall program
. Haga que su respuesta sea consciente de la falla y revocaré mi voto negativo.Como alternativa a la respuesta de dmckee, también se puede usar el
grep
comando con el comando de-m
opción (ver, por ejemplo, esta página de manual ):para detenerse cuando se encuentra 1 línea que coincide con el texto o
esperar 10 líneas que no coinciden con el texto dado.
fuente
Puede usar
expect(1)
para ver la salida estándar de un programa y luego ejecutar una acción predefinida en algunos patrones.O una línea para incrustar en otro script:
Tenga en cuenta que el
expect
comando no viene con todos los sistemas operativos de forma predeterminada. Es posible que deba instalarlo.fuente
set timeout -1
establecer un tiempo de espera indefinido, de lo contrario, todo se cerrará conexpect
el tiempo de espera predeterminado de 10 segundos.Podría usar una declaración "while":
Debe canalizar la salida de su software (o de sus registros) y luego, para cada nueva línea, hacer una prueba de condición, luego ejecutar kill -KILL. Por ejemplo (probé con / var / log / messages como el archivo de registro):
O con el software directamente:
Debe volver a colocar la ruta de registro / nombre de la aplicación, la línea para que coincida y el PID para matar (también puede usar killall).
Buena suerte con tu software
Hugo
fuente