En el trabajo tenemos una supercomputadora accesible vía SSH.
Iniciamos sesión, reservamos los núcleos usando bsub
un comando con parámetros, y este último crea (desde el documento) "una sesión bash interactiva con pseudo-terminal".
En ese "pseudo-terminal" luego vamos a una carpeta, iniciamos el solucionador con parámetros y dejamos que se ejecute hasta su finalización.
Entonces, la aplicación se completa y la sesión permanece abierta, y los núcleos reservados permanecen reservados, luego, un par de días después (si el sim terminó el viernes después del trabajo), TI envía un correo electrónico el lunes indicando que los núcleos están reservados, pero no ven actividad. , bla, bla, bla...
He comprobadohttps://stackoverflow.com/questions/14254118/waiting-for-background-processes-to-finish-before-exiting-scriptyBash: ¿cómo ejecutar un comando una vez finalizado el anterior?y otros foros/tutoriales, pero todo lo que encuentro es cómo mantener una aplicación en ejecución después de cerrar la terminal (desconectar la aplicación de una terminal).
Necesito lo contrario, quiero cerrar la terminal (este puede ser el último paso del solucionador, por lo que podría salir de la terminal y morir)
Estoy abierto a sugerencias, puedo hacerlo en un script o puedo pedirle al chico que lo codifique en su solucionador de C++.
Intenté lo siguiente (en mi servidor Ubuntu ejecutándose en una máquina virtual, espero que esto funcione más o menos igual en cualquier bash
entorno, corríjame si me equivoco):
retardo_prueba.c:
#include <stdio.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
printf("Doing some fake lengthy operation...");
sleep(15); // sleep for 15 seconds
return 0;
}
Compila y ejecuta como se esperaba. Intenté system("clear");
(parte de stdlib.h
) antes de regresar, y eso también funciona, recibo el mensaje, luego, 15 segundos después, la pantalla se borra y la aplicación se cierra.
Luego lo intenté system("exit");
y no pasa nada (quiero decir, la aplicación se cierra como si esa exit
declaración no estuviera allí...). Mi mejor suposición es que la aplicación tiene que regresar antes de que uno pueda salir de la terminal, pero es sólo una suposición.
También probé una forma de script:
prueba.sh:
#!/bin/bash
./delay_test &
wait
exit
En este caso, según tengo entendido, la exit
declaración es para finalizar el script, pero necesito salir de la sesión del terminal una vez que finalice la aplicación en cuestión.
Entonces, ¿qué puedo hacer para forzar la salida del "pseudoterminal" después de que se cierre la aplicación?
Respuesta1
La forma más sencilla en el shell proporcionado por el bsub
comando es anteponer cualquier comando que vaya a ejecutar exec
, que es un shell integrado que reemplazará el shell proporcionado con su solucionador:
exec yoursolver
Cuando yoursolver
salga, volverá a bsub
, ya que el solucionador reemplazó el shell hace mucho tiempo.
(Aparte, tenga en cuenta que algunos lenguajes (TCL, PHP) tienen exec
una no me gusta en absolutoel shell o Perl exec
o las exec(3)
funciones de C, por lo que si está usando o familiarizado con esos lenguajes, tenga en cuenta esta diferencia; las versiones TCL y PHP son más parecidas a la función C system(3)
o Perl system
o a escribir los comandos en un shell en el sentido de que el proceso original todavía existe después).