Wie kann ich ein Terminal schließen, ohne seine Kinder zu töten (ohne vorher "screen" auszuführen)?

35

manchmal starte ich eine app im gnome-terminal, aber dann muss ich plötzlich gnome neu starten oder so. Ich denke, die Antwort auf die Frage ist auch nützlich, wenn ich mich von SSH trennen möchte, wo etwas passiert.

Der Terminalbaum von Gnome sieht folgendermaßen aus:

gnome-terminal
    bash
        some-boring-process

Can I ‚detach‘ bashaus gnome-terminal(oder detach some-boring-processvon bash und leitet seine Ausgabe irgendwo)? Wenn ich nur töte gnome-terminal, bashwerden alle seine Unterprozesse getötet

valya
quelle

Antworten:

48

Wenn some-boring-processin Ihrer aktuellen Bash-Sitzung ausgeführt wird:

  1. halt es mit ctrl-zan, um dir die Bash-Eingabeaufforderung zu geben
  2. stelle es in den Hintergrund mit bg
  3. Notieren Sie die Auftragsnummer oder verwenden Sie den jobsBefehl
  4. Trennen Sie den Prozess von dieser Bash-Sitzung mit disown -h %1(ersetzen Sie die tatsächliche Jobnummer dort).

Damit wird die Ausgabe nicht umgeleitet - das müssen Sie berücksichtigen, wenn Sie Ihren langweiligen Prozess starten. [Bearbeiten] Es scheint eine Möglichkeit zu geben, diese umzuleiten: https://gist.github.com/782263

Aber im Ernst, schauen Sie in den Bildschirm. Ich habe Muscheln auf einem Remote-Server, die seit Monaten ausgeführt werden.

Glenn Jackman
quelle
Vielen Dank. Ich habe Ihre Antwort ausgewählt, weil es die einzige war, die die Frage beantwortete (es handelte sich um einen bereits laufenden Prozess). Ich benutze bereits screenmanchmal, obwohl es seine Probleme hat und ich möchte es nicht für jede Bash-Sitzung in meinem Leben verwenden
Valya
Sie verwenden es nicht für jede Bash-Sitzung, sondern für jeden Remote-Computer, auf dem Sie viel Zeit verbringen.
Glenn Jackman
Ich habe mir erlaubt, Informationen zum Umleiten der Ausgabe hinzuzufügen. Bitte überprüfen Sie diese!
Valya
[root @ server ~] # bg -bash: bg: aktuell: kein solcher Job
Muhammad Dyas Yaskur
Warum habe ich bash: bg: current: no such job?
Muhammad Dyas Yaskur
10

Genau dafür wurden screen und tmux erstellt. Sie führen die Shell in der screen / tmux-Sitzung aus und können die Verbindung nach Belieben trennen / wiederherstellen. Sie können auch mehrere Shell-Sitzungen in einem Gnome-Terminal ausführen.

jsbillings
quelle
Vielen Dank, aber, wie ich auf die akzeptierte Antwort kommentierte: 1. Die Frage betraf bereits laufende Prozesse. 2. screenhat seine Probleme und ich habe keine Lust, es für jede Bash-Sitzung in meinem Leben zu verwenden
valya
6

screen,, tmuxoder dtach(möglicherweise mit dvtm) sind alle großartig dafür, aber wenn es etwas ist, bei dem Sie nicht daran gedacht haben, eines davon zu verwenden, können Sie es möglicherweise nutzen nohup.

Hank Gay
quelle
Vielen Dank, aber, wie ich auf die akzeptierte Antwort kommentierte: 1. Die Frage betraf bereits laufende Prozesse. 2. screenhat seine Probleme und ich habe keine Lust, es für jede Bash-Sitzung in meinem Leben zu verwenden
Valya
@valya Schön, dass du eine Lösung gefunden hast. Nur um klar zu sein, nohupfunktioniert die Ausführung eines Prozesses mithilfe der -pOption (falls verfügbar).
Hank Gay
@Hank Gay: Ich kann keine -pOption nohupin den Manpages sehen. Auf welchem ​​System bist du?
Mikel
@Mikel Bevor ich gelernt habe, mich nicht mehr zu sorgen und das zu lieben tmux, habe ich die -pOption auf einer Solaris-Box verwendet. Ich habe auch vage Erinnerungen daran, wie ich es auf einer CentOS-Box mit Mischlingen gemacht zshhabe.
Hank Gay
@Hank Gay: Weder auf meinem Ubuntu bashnoch zshauf meinem Linux-System bieten nohup.
Mikel
4

Wenn Sie weiterhin mit dem untergeordneten Prozess interagieren möchten, anstatt ihn lediglich zu untermalen und am Laufen zu halten, gibt es ein Programm namens retty, das als Proof-of-Concept- Methode dient, um einen Prozess aus seiner aktuellen Tty zu "stehlen" und ihn erneut mit der Tty zu verknüpfen der Momentane.

Es führt jedoch einige schreckliche Dinge aus, darunter das Aufkleben von Assembly-Code auf den Stapel der neu angefügten Anwendung. Und dieser Code wurde für x86_64 nicht aktualisiert.

Es gibt ein anderes Programm, das einen vielleicht besseren Ansatz verfolgt und den Prozess im User-Space auf eine Datei beschränkt, aus der er später wiederhergestellt werden kann (möglicherweise auf einem anderen Tty). Dies ist Cryopid , und auch dieses Projekt scheint in der angehalten zu haben Proof-of-Concept-Phase und funktioniert unter modernem Linux im aktuellen Code nicht. Ah, gut.

Ich dachte nur, dies sollte der Vollständigkeit halber hier sein. Wenn es Ihnen nichts ausmacht, auf schreckliches Voodoo zurückzugreifen, liegt dies im Bereich der Möglichkeit - zumindest der theoretischen Möglichkeit.

mattdm
quelle
1
das erinnert mich an gist.github.com/782263 ... oh, das scheint auch meine Frage zu beantworten
valya
2

Wenn ich etwas auslöse, das ich zu Ende bringen möchte (kurz vor dem Neustart des Systems), verwende ich es nohupund starte es im Hintergrund. Im Gegensatz zu Bildschirm und dergleichen können Sie die Prozesse nicht erneut zuordnen. Wenn Sie die Umleitung jedoch an einer anderen Stelle sperren, finden Sie alle Ausgaben in nohup.out.

Ich benutze, screenwenn ich in der Lage sein möchte, Terminals für einen Prozess zu wechseln. B. einen Prozess von zu Hause / von der Arbeit aus zu starten und zum anderen zu wechseln. Wie bei jeder anderen Ausgabe einer Terminalsitzung wird der Bildlauf eventuell vom oberen Rand des Puffers ausgeführt.

BEARBEITEN: Wenn Sie den Prozess bereits gestartet haben, können Sie disownden Prozess so einstellen, dass das HUPSignal nicht gesendet wird, wenn der Prozess geschlossen wird.

BillThor
quelle
Vielen Dank, aber, wie ich auf die akzeptierte Antwort kommentierte: 1. Die Frage betraf bereits laufende Prozesse. 2. screenhat seine Probleme und ich habe keine Lust, es für jede Bash-Sitzung in meinem Leben zu verwenden
valya
Ich habe Hinweise auf das Trennen eines laufenden Prozesses von der Programmgruppe gesehen. Ich kenne allerdings keine Werkzeuge dafür. Das Tool müsste wahrscheinlich auch die Standard-E / A-Kanäle umleiten. Ich glaube, ich habe es vielleicht einmal zum Laufen gebracht, aber ich habe entschieden, dass nohup einfacher war.
BillThor
1

Sie können festlegen, dass ein Prozess (PID) nach Beendigung der Terminalsitzung kein HUP-Signal empfängt. Verwenden Sie den folgenden Befehl:

nohup -p PID
Tony
quelle
nohup: invalid option -- 'p'. Welche Version von nohuplaufen Sie auf welcher Art von System?
Anthon
Ich benutze hauptsächlich Solaris und AIX. Für Linux sollten Sie den Befehl disown einchecken.
Tony
Ja, -punter Linux gibt es keine Option. Diese Antwort ist Solaris- und AIX-spezifisch. Gut zu wissen
Sergiy Kolodyazhnyy
1

Dieses Skript trennt den untergeordneten Prozess vom übergeordneten Prozess und weist ihn dem Init- Prozess zu:

toDetach=$1

./$toDetach & # Runs the process - script on background

disown -h %$(jobs -l | grep $(ps -A | grep $toDetach | cut --delimiter=' ' -f1) | cut --delimiter=' ' -f1 | tr -d '[]+') # and then disowns it from parents process
mark_infinite
quelle