Cerrar una terminal desde una aplicación que se inició en esa terminal

Cerrar una terminal desde una aplicación que se inició en esa terminal

En el trabajo tenemos una supercomputadora accesible vía SSH.

Iniciamos sesión, reservamos los núcleos usando bsubun 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 bashentorno, 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 exitdeclaració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 exitdeclaració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 bsubcomando 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 yoursolversalga, volverá a bsub, ya que el solucionador reemplazó el shell hace mucho tiempo.

(Aparte, tenga en cuenta que algunos lenguajes (TCL, PHP) tienen execuna no me gusta en absolutoel shell o Perl execo 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 systemo a escribir los comandos en un shell en el sentido de que el proceso original todavía existe después).

información relacionada