Schließen eines Terminals aus einer App, die in diesem Terminal gestartet wurde

Schließen eines Terminals aus einer App, die in diesem Terminal gestartet wurde

Bei der Arbeit haben wir einen Supercomputer, auf den über SSH zugegriffen werden kann.

Wir melden uns an, reservieren die Kerne mit bsubeinem Befehl mit Parametern und dieser erstellt (laut Dokument) „eine interaktive Bash-Sitzung mit Pseudo-Terminal“.

In diesem „Pseudo-Terminal“ gehen wir dann in einen Ordner, starten den Solver mit Parametern und lassen ihn vollständig durchlaufen.

Die App wird also abgeschlossen, die Sitzung bleibt geöffnet und die reservierten Kerne bleiben reserviert. Ein paar Tage später (wenn die Sim am Freitag nach der Arbeit beendet wurde) sendet die IT am Montag eine E-Mail, in der angegeben wird, dass die Kerne reserviert sind, aber sie sehen keine Aktivität, bla, bla, bla …

Ich habe geprüfthttps://stackoverflow.com/questions/14254118/waiting-for-background-processes-to-finish-before-exiting-scriptUndBash – wie führt man einen Befehl aus, nachdem der vorherige abgeschlossen ist?und andere Foren/Tutorials, aber ich finde nur Informationen dazu, wie man eine Anwendung nach dem Schließen des Terminals (durch Trennen der Anwendung vom Terminal) am Laufen hält.

Ich brauche das Gegenteil, ich möchte das Terminal schließen (das kann der letzte Schritt des Solvers sein, er könnte also das Terminal verlassen und beendet werden)

Ich bin offen für Vorschläge. Ich kann es in einem Skript machen oder den Typen bitten, es in seinem C++-Solver zu codieren.

Ich habe Folgendes versucht (auf meinem Ubuntu-Server, der in einer VM läuft; ich gehe davon aus, dass dies in jeder bashUmgebung mehr oder weniger gleich funktioniert; korrigieren Sie mich bitte, wenn ich falsch liege):

delay_test.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;
}

Kompiliert und läuft wie erwartet. Ich habe system("clear");(einen Teil von stdlib.h) ausprobiert, bevor ich zurückgekehrt bin, und das funktioniert auch. Ich erhalte die Meldung, dann wird 15 Sekunden später der Bildschirm gelöscht und die App beendet.

Dann habe ich es versucht system("exit");und nichts passiert (ich meine, die App wird beendet, als ob diese exitAnweisung nicht da wäre ...). Meine beste Vermutung ist, dass die App zurückkehren muss, bevor man das Terminal verlassen kann, aber das ist nur eine Vermutung.

Ich habe es auch mit einem Skript versucht:

test.sh:

#!/bin/bash
./delay_test &
wait
exit

In diesem Fall verstehe ich es so, dass die exitAnweisung dazu dient, das Skript zu beenden, ich aber die Terminalsitzung verlassen muss, sobald die betreffende App beendet wird.

Was kann ich also tun, um das Beenden des „Pseudo-Terminals“ nach dem Beenden der App zu erzwingen?

Antwort1

Der einfachste Weg bsubbesteht darin, in der vom Befehl bereitgestellten Shell dem auszuführenden Befehl das Präfix zu geben. execDabei handelt es sich um ein in der Shell integriertes Präfix, das die bereitgestellte Shell durch Ihren Solver ersetzt:

exec yoursolver

Beim yoursolverBeenden wird zu zurückgekehrt bsub, da die Shell längst durch den Solver ersetzt wurde.

(Beachten Sie nebenbei, dass einige Sprachen (TCL, PHP) eine haben, execdie überhaupt nicht wiedie Shell oder Perl execoder die C- exec(3)Funktionen. Wenn Sie diese Sprachen verwenden oder damit vertraut sind, beachten Sie diesen Unterschied. Die TCL- und PHP-Versionen ähneln eher der C- system(3)oder Perl- systemFunktion oder dem Eingeben der Befehle in eine Shell, da der ursprüngliche Prozess anschließend noch vorhanden ist.)

verwandte Informationen