0votos

Ejecutar y monitorizar ejecución de un proceso durante un tiempo t en Shell

por josejuan hace 6 años

bash -c "while :;do $j;done" & p=$!;sleep $t;kill -9 $p

Crear un script o programa que llamaremos guardián que reciba como parámetros el tiempo de ejecución necesario y el proceso o programa que debe ejecutar. Guardián deberá asegurarse de que el programa/proceso que recibe como parámetro se ejecuta exactamente durante el tiempo recibido en el otro parámetro. Ejemplo: guardian 00:00:15 mi_programa Esto quiere decir, que guardián lanzará el programa mi_programa, lo ejecutará, y vigilará que esté en ejecución durante 15segundos

1
2
3
4
5
6
bash -c "while :;do $j;done" & p=$!;sleep $t;kill -9 $p 
 
# $j es el trabajo a realizar, eg. j='find /' 
# $t es el tiempo de ejecución, eg. t=5 
 
# añadase tanto verbose como se desee (para monitorizar, digo) 
7 comentarios
0votos

Escrito por moisespd hace 6 años

y si durante su ejecución finaliza inesperadamente, ¿cómo se asegura de que no ha sido así, y en su caso, volver a ponerlo en ejecución?
0votos

Escrito por josejuan hace 6 años

o bien el proceso tarda más del indicado y en cuyo caso sólo corre una vez, o bien el proceso tarda menos del indicado y el bucle "while" lo lanza de nuevo
0votos

Escrito por moisespd hace 6 años

y qué ocurre si matamos manualmente el proceso? No se habría ejecutado durante el tiempo deseado

En sistemas en tiempo real es "habitual" que un proceso finalice de forma inesperada, y debemos ponerlo en marcha otra vez para garantizar que se ejecuta durante el tiempo deseado
0votos

Escrito por josejuan hace 6 años

el proceso volverá al shell, si TU MATAS el proceso, lo estás matando, un proceso en tiempo real (o cualquier otro) que HA SIDO LANZADO POR EL SHELL, volverá al shell.

si lo deseas, puedes meter el proceso "$j" en otra llamada al shell, así, tendrás otro subproceso que, en caso de matarlo, será recuperado por el proceso shell del while (con otro pid diferente).

en tal caso, usarás pkill -9 -P $p para matar al hijo si se excede en tiempo (después del "kill -9 $p")

pero a mí me gusta más mi solución actual, te permite matar al proceso directamente y controla una rotura del mismo (que viene siendo lo normal).

impedir un kill -9 es algo muy malo muy malo...
0votos

Escrito por jneira hace 6 años

Estaba yo añadiendo verbose a mi solucion de haskell y releyendo los requisitos me ha entrado una duda. No controlo demasiado del bash pero me da la sensacion como que tu oneliner reejecuta el programa tantas veces como sea necesario pero todas esas veces no exceden el tiempo t. O sea que si pones 15 segundos y hay una ejecucion de 10, el while ejecutara de nuevo el programa pero a los 5 segundos lo matara. Sin embargo segun entiendo en el enunciado:
"Si durante el tiempo de ejecución, guardián detecta que mi_programa ha finalizado prematuramente, volverá a ejecutarlo y se volverá a asegurar que está durante 15 segundos en ejecución".
O sea que si a los 10 segundos se interrumpe tiene que volver a lanzarlo para que dure 15 s con lo que si tiene exito en su 2 intento el tiempo total habra sido de 25 segundos.
0votos

Escrito por josejuan hace 6 años

"Volverse a asegurar" no significa "Volver a empezar a contar el tiempo".

Puede aclararlo el autor (si lo estimas pertinente).

De todos modos, el problema que indicas es mucho más sencillo que el resuelto, porque no precisa de una llamada al bash ¿sabrías cómo? XD XD XD.
0votos

Escrito por moisespd hace 6 años

Quizás esté mal redactado, pero la idea es ésa: si finaliza a los 10 segundos y había sido programado para 15s, deberá volverse a ejecutar no para completar los 5s que le faltan, sino para volver a ejecutarse 15s, ya que éste es el tiempo que debe estar de forma ininterrumpida en ejecución

Un saludo y espero haber aclarado la pregunta

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.