Bei der Arbeit haben wir einen Supercomputer, auf den über SSH zugegriffen werden kann.
Wir melden uns an, reservieren die Kerne mit bsub
einem 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 bash
Umgebung 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 exit
Anweisung 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 exit
Anweisung 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 bsub
besteht darin, in der vom Befehl bereitgestellten Shell dem auszuführenden Befehl das Präfix zu geben. exec
Dabei handelt es sich um ein in der Shell integriertes Präfix, das die bereitgestellte Shell durch Ihren Solver ersetzt:
exec yoursolver
Beim yoursolver
Beenden 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, exec
die überhaupt nicht wiedie Shell oder Perl exec
oder 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- system
Funktion oder dem Eingeben der Befehle in eine Shell, da der ursprüngliche Prozess anschließend noch vorhanden ist.)