Wie kann ich Prozesse nach dem Beenden der SSH-Sitzung am Laufen halten?

644

Angenommen, ich starte eine Reihe von Prozessen aus einer SSH-Sitzung. Ist es möglich, die SSH-Sitzung zu beenden, während diese Prozesse auf dem Remotecomputer ausgeführt werden?

Olivier Lalonde
quelle
2
Related: unix.stackexchange.com/questions/4004/…
Anton Tarasenko

Antworten:

750

Sie sollten nach modernen Alternativen wie suchen tmux.

tmuxist screenaus vielen Gründen überlegen , hier nur einige Beispiele:

  • Windows kann zwischen Sitzungen verschoben und sogar mit mehreren Sitzungen verknüpft werden
  • Fenster können horizontal und vertikal in Fenster aufgeteilt werden
  • Unterstützung für UTF-8- und 256-Farben-Terminals
  • Sitzungen können von der Shell aus gesteuert werden, ohne dass eine Sitzung eingegeben werden muss

Grundlegende Funktionalität

Um die gleiche Funktionalität zu erhalten , wie erklärt in der Antwort zu empfehlen screen, würden Sie müssen folgendes tun:

  • ssh in die entfernte Maschine
  • Beginnen Sie tmuxmit der Eingabe tmuxin die Shell
  • Starten Sie den gewünschten Vorgang in der gestarteten tmuxSitzung
  • Verlassen / Trennen Sie die tmuxSitzung, indem Sie Ctrl+ bund dann eingebend

Sie können sich jetzt sicher von der Remote-Maschine abmelden, Ihr Prozess läuft weiter tmux. Wenn Sie wieder zurückkehren und den Status Ihres Prozesses überprüfen möchten, können Sie ihn tmux attachals Anlage zu Ihrer tmuxSitzung verwenden.

Wenn Sie mehrere Sitzungen nebeneinander ausführen möchten, sollten Sie jede Sitzung mit Ctrl+ bund benennen $. Mit können Sie eine Liste der aktuell ausgeführten Sitzungen abrufen. Fügen Sie sie tmux list-sessionsjetzt mit dem Befehl zu einer ausgeführten Sitzung hinzu tmux attach-session -t 0.

tmuxkann viel fortgeschrittenere Dinge tun, als ein einzelnes Fenster in einer einzelnen Sitzung zu behandeln. Weitere Informationen finden Sie in man tmuxoder auf der tmux GitHub-Seite . Im Folgenden finden Sie eine FAQ zu den wichtigsten Unterschieden zwischen screenund tmux.

Tongpu
quelle
4
@CraigM Verwenden Sie screen -x -r [screenname]oder screen -rxkurz, wenn nur eine Bildschirmsitzung aktiv ist. Auf diese Weise können Sie eine vorhandene Bildschirminstanz anhängen.
Lekensteyn
5
Dieser Rat hat mir bei dem gleichen Problem geholfen, aber ich denke, er enthält einen Tippfehler. Ich bin mir ziemlich sicher, dass Sie tippen müssen Ctrl-bund dann d, um die tmuxSitzung zu verlassen / zu trennen . Das gilt natürlich für die Version von tmuxauf meinem Ubuntu 12.04.
cxrodgers
17
Ich habe einen Fehler gemacht, als ich die obigen Anweisungen befolgt habe. Ich werde es teilen, wenn jemand in den gleichen Fehler gerät: Ich habe tmux in der Shell meines eigenen Computers anstelle der Shell des Remote-Computers gestartet. Man muss tmux in der Shell des entfernten Computers starten.
Mert Nuhoglu
5
Screen wird jetzt erneut entwickelt: lists.gnu.org/archive/html/screen-devel/2014-04/msg00024.html Können Sie Ihre Antwort aktualisieren?
muru
4
Alternativ können Sie auch ausführen, tmux detachanstatt ctrl-b d
Andrew,
305

Option 1: nohup

Der beste Weg ist oft der einfachste.

nohup long-running-command &

Es wurde speziell dafür gemacht, es protokolliert sogar stdout zu nohup.log.

man nohup

Option 2: bg

Wenn Sie einige bereits ausgeführte Aufgaben im Hintergrund ausführen möchten, sollten Sie Ctrl+ und Zdann ausführen

bg

um die letzte angehaltene Aufgabe in den Hintergrund zu stellen und sie weiter ausführen zu lassen.

Dann sollte ein Quick disownden Prozess nach dem Abmelden weiterlaufen lassen.

screenund andere können es, aber dafür sind sie nicht. Ich empfehle nohupfür Aufgaben, von denen Sie wissen, dass Sie sie hinter sich lassen, und bgfür Aufgaben, die Sie bereits ausführen und nicht neu starten möchten.

Denken Sie daran, beide sind bash-spezifisch. Wenn Sie Bash nicht verwenden, können die Befehle unterschiedlich sein.

coteyr
quelle
4
Ich würde es empfehlendisown -h
Michele
Interessanterweise Bildschirm und tmux funktioniert nicht für Bergmann, bur nohup funktioniert
Yasin Okumuş
1
bg+ disownhat bei mir nicht funktioniert. Ich hatte ein Implementierungsskript ausgeführt, das ich vergessen habe, in tmux zu starten, und musste frühzeitig zu einem Meeting aufbrechen. Das Skript gibt den Fortschritt kontinuierlich an die Shell aus. ctrl+zstoppte den Prozess und brachte mich zurück zu Bash. bgsetzte den Vorgang fort, gab aber auch den Status erneut als Bash aus, sodass ich nicht mehr sehen konnte, was ich eingab. Ein disownBefehl erzeugte jedoch "disown: current: no such job"
BrianHVB
Das hat bei mir julia myFile.jlaus irgendeinem Grund nicht funktioniert . tmux tut und ist großartig.
Kilgoretrout
Das hat bei mir funktioniert, vielen Dank
Chad
207

Sie könnten das mit tun screen.

Geben Sie ein man screen, um mehr zu erfahren, oder lesen Sie diese Bildschirm-Manpage .

Einfaches Szenario:

  • ssh in deine remote box. Typ screenDann starten Sie den gewünschten Prozess.

  • Drücken Sie Ctrl- Adann Ctrl- D. Dadurch wird Ihre Bildschirmsitzung "getrennt", die Prozesse werden jedoch weiterhin ausgeführt. Sie können sich jetzt von der Remote-Box abmelden.

  • Wenn Sie später wiederkommen möchten, melden Sie sich erneut an und geben Sie Folgendes ein: screen -rDamit wird Ihre Bildschirmsitzung "fortgesetzt", und Sie können die Ausgabe Ihres Prozesses sehen.

Lincoln
quelle
32
Normalerweise benenne ich meine Bildschirmsitzungen mit screen -S name, um es später einfacher zu machen, die richtige Verbindung herzustellen.
David Oneill
Der Link ist ausgefallen
Gab 是 好人
1
Persönlich arbeite ich an einer Box ohne Software zur Paketsteuerung. Nachdem ich ungefähr eine halbe Stunde damit verbracht hatte, Abhängigkeiten für TMUX (mit denen ich persönlich Erfahrung habe und die ich mag) aus dem Quellcode aufzubauen, wurde mir klar, dass Bildschirm die bessere und einfachere Lösung für mich war. TL; DR: Die optimale Lösung für dieses Problem hängt vom Anwendungsfall, der Maschine und der Zeit ab, die Sie zum Einrichten benötigen. Vielen Dank für diese Antwort :)
Max von Hippel
Kombination mit screen -Svor dem Urlaub und screen -rbei der Rückkehr ist erstaunlich!
Meloman
Danke dafür. Diese Lösung hat bei mir funktioniert, während es bei tmux nicht der Fall war (ich verwende eine Version von bash für Windows, während ich in eine Linux-Maschine hineinschaue)
Michael Sorensen,
83

Screen und Nohup ist der bessere Weg, aber wenn Sie einen Prozess trennen müssen, der bereits ohne Screen oder Nohup ausgeführt wird, können Sie den Befehl disown ausführen.

disown [-ar] [-h] [jobspec… |pid… ]

Entfernen Sie ohne Optionen jede Jobspezifikation aus der Tabelle der aktiven Jobs. Wenn die -hOption angegeben ist, wird der Job nicht aus der Tabelle entfernt, sondern markiert, damit SIGHUP nicht an den Job gesendet wird, wenn die Shell ein SIGHUP empfängt. Wenn die Jobspezifikation nicht vorhanden ist und weder die Option -anoch die angegeben -rsind, wird der aktuelle Job verwendet. Wenn keine Jobspezifikation angegeben ist, -abedeutet die Option, dass alle Jobs entfernt oder markiert werden. Die -rOption ohne Jobspec- Argument beschränkt die Ausführung von Jobs.

Mit disown können Sie das Terminal schließen und den Prozess auf dem Computer ausführen.

Bassgey
quelle
10
Dies ist auch meine Lieblingsmethode. Ich benutze häufigdisown -a && exit
Stefano Palazzo
1
Perfekt. Dies ist ein schöner Befehl und verdient alle Gegenstimmen!
Greg
8
Ein Wort der Vorsicht: Ich habe einen laufenden Prozess mit Strg-Z gestoppt und ihn nicht im Hintergrund gestartet, bevor ich ihn aufgerufen habe, disownund er hat ihn beendet.
HDave
3
Kann abstürzen, wenn es in das Terminal schreiben möchte. Das Umleiten der Ausgabe eines laufenden Prozesses ist nicht so einfach. Besser mit nohup richtig anzufangen.
Jiggunjer
2
Dies ist eine gute Antwort, da sie die Frage direkt beantwortet. Der Autor der Frage fragte, was zu tun ist, nachdem er bereits einige lange laufende Befehle ausgeführt hatte. In den meisten dieser Antworten erfahren Sie, was zu tun ist, bevor Sie die Befehle ausführen.
q0rban
53

Ich war in einem großen MV stecken geblieben, also war ich nicht in der Lage, den Prozess zu stoppen, den Bildschirm einzurichten und ihn dann erneut zu starten. Ich habe es geschafft, die SSH-Sitzung mit dem laufenden Prozess zu beenden, indem ich im Wesentlichen die folgenden Schritte ausgeführt habe:

  1. ssh [server]
  2. Befehl
  3. Ctrl+Z
  4. bg
  5. disown [process pid optional, Standardeinstellung last]
  6. Ausfahrt

Schritt 3 unterbricht den aktuellen Vorgang (z. B. mein 'mv'-Befehl).
Schritt 4 stellt den angehaltenen Prozess in den Hintergrund und setzt ihn fort.
In Schritt 5 können Sie den Prozess ablehnen. ** Um eine Liste der Jobs zu erhalten, geben Sie diese einfach jobsvorher ein.


** In Bezug auf Ablehnung (aus Bash-Handbuch):

disown [-ar] [-h] [jobspec ... | pid ... ]
              Without  options,  remove  each jobspec from the table of active
              jobs.  If jobspec is not present, and neither the -a nor the  -r
              option  is  supplied, the current job is used.  If the -h option
              is given, each jobspec is not removed from  the  table,  but  is
              marked  so  that  SIGHUP  is  not  sent  to the job if the shell
              receives a SIGHUP.  If no jobspec is  supplied,  the  -a  option
              means  to  remove or mark all jobs; the -r option without a job‐
              spec argument restricts operation to running jobs.   The  return
              value is 0 unless a jobspec does not specify a valid job.
Chaos
quelle
2
Built-in's sind immer meine erste Wahl :) THX
Ken_oy
Diese Antwort sollte als richtig markiert sein. Die Installation und Gewöhnung an den Bildschirm zur Lösung dieses Problems ist übertrieben.
Ulrich-Lorenz Schlüter
Dies ist sehr hilfreich, wenn Sie bereits einen Befehl gestartet haben und dieser lange ausgeführt wird. Das Beenden und Starten in einer TMUX-Sitzung wird
einige
1
@ tom-brossman: Bitte achte auf unnötige Änderungen wie diese ! Wenn der disownBefehl ohne Jobspezifikation aufgerufen wird, wird der aktuellste Hintergrundjob verarbeitet.
David Foerster
22

Es gibt zwei Hauptprogramme, mit denen Sie Programme und den Terminalstatus über mehrere SSH-Verbindungen verwalten können. Sie sind screen (der Amtsinhaber, aber leider nicht gewartet. Offenbar wird sie gerade aktiv entwickelt ) und tmux (neuer, aktiv gewartet). Byobu ist ein Front-End, das auf diesen Systemen ausgeführt werden kann und zusätzliche Ubuntu-Statusinformationen bietet. Bei Neuinstallationen wird tmux als Backend verwendet. Wenn Sie eine ältere byobu-Installation und eine vorhandene Konfiguration haben, wird das vorherige Backend beibehalten, sei es screen oder tmux.

Byobu

Byobu kann auf dem Computer installiert werden, indem Sie dies auf einem Debian-basierten Computer tun:

sudo aptitude install byobu

Mit yum machst du das

su -c 'yum install byobu'

Es ist auch möglich, byobu auf anderen Distributionen zu installieren.

Byobu verwenden

Sie können byobu starten, indem Sie nach dem Herstellen einer byobuVerbindung mit ssh auf dem Hostcomputer ausgeführt werden. Dies gibt Ihnen eine Shell, die so aussieht:

Bild-Byobu

Sie können Byobu Terminal auch auf einem Ubuntu-Computer mit -X-Option verwenden und haben problemlos ein perfekt funktionierendes Byobu.

Verwendungszweck:

Starten Sie byobu durch Eingabe byobu.

Sie können F2 drücken, um innerhalb der aktuellen Sitzung ein neues Fenster zu erstellen, F3-F4, um zwischen den verschiedenen Fenstern zu wechseln.

Das Beste an byobu ist, dass Sie die im Terminal ausgeführten Prozesse nicht wirklich beenden müssen, um das Terminal zu verlassen. Sie können einfach screen / tmux (das Skelett von byobu) in den Hintergrund schicken und das nächste Mal fortsetzen, wenn Sie kommen:

  • Drücken Sie F6, um Byobu zu verlassen und fortzufahren (abzunehmen).
  • byobuWenn du das nächste Mal kommst, tu es einfach und du sollst wieder da sein, wo du warst.

    byobu-detach-attach

Sie können auch nach und nach verschiedene Byobu-Sitzungen erstellen byobu -S session1. Und wenn Sie zurückkommen, können Sie eine der beiden Verbindungen herstellen.

Mit Byobu können Sie noch viel mehr tun. Benutze es! Einige endgültige Anleitungen sind hier oder hier .

SiddharthaRT
quelle
Ich habe versucht, byobu von einer PuTTY-basierten Sitzung auf meine Ubuntu-Box zu übertragen, aber ich bekomme die Statuszeile wiederholt und scrolle auf dem Display. Obwohl es sich durch Drücken von F6 ordnungsgemäß löste, war es in meinem Setup keine brauchbare Lösung.
jfmessier
1
@jfmessier Es liegt daran, dass PuTTY ncurses (utf-8 im Grunde genommen) nicht gut akzeptiert. Es ist möglich, dieses Problem zu beheben, indem Sie diesem Thread folgen
SiddharthaRT
Das ist fantastisch! 1. Es gibt mir eine farbige Bash-Eingabeaufforderung, die ich scheinbar nicht mit Bash als Standardshell aktivieren kann. 2. Ich kann 2 Bots gleichzeitig ausführen und habe immer noch ein anderes Terminal, an dem ich arbeiten kann. @SiddharthaRT Sie verdienen eine positive Bewertung, Sir!
Dev
18

Sie können dies nicht tun, wenn der Prozess einmal gestartet wurde. Sie müssen die Dinge eingerichtet haben, bevor Sie einen Job mit langer Laufzeit ausführen können.

Sie können nohup verwenden, aber die moderne Weisheit schlägt vor, dass Sie screen oder byobu als Login verwenden, damit Sie die Verbindung trennen und die Dinge am Laufen lassen können.

Screen hat den Vorteil, dass Sie von einer Maschine trennen und von einer anderen wieder anbringen können, was praktisch ist, wenn Sie lange laufende Prozesse überprüfen möchten, die über das Ende des Arbeitstages hinaus laufen.

Hier finden Sie eine angemessene Anleitung für den Einstieg in den Bildschirm .

byobu setzt eine einfach zu bedienende Oberfläche mit Menüs etc. oben auf den Bildschirm. Es ist auch die aktuelle Implementierung von screen auf neueren Ubuntu. F2 zum Starten eines neuen Terminals F3 / F4 zum Hin- und Herschalten und F6 zum Trennen. Geben Sie exit ein, um die Terminals dauerhaft zu beenden.

Richard Holloway
quelle
Byobu verwendet TMUX in diesen Tagen ..
Scottl
12
"Sie können dies nicht tun, nachdem der Prozess gestartet wurde. Sie müssen die Einstellungen vorgenommen haben, bevor Sie einen Auftrag mit langer Laufzeit ausführen können." - Nein, Sie können disowndies erreichen. Siehe @ Bassgeys Antwort
Rich
1
nach dem kampf um bildschirm und tmux zu lernen ... brachte byobu tränen in die augen
HDave
disownund wenn gerade gebraucht Ctrl-z, dann bgum es vom aktiven terminal in den hintergrund zu bekommen. Dann disown.
Mimoralea
8

Hey, obwohl ich mir einig war, dass der Bildschirm die effektivste Option ist. Sie können vncserver verwenden und dann den Prozess darauf starten.

Wenn der Prozess nur ausgeführt werden soll und Sie nicht die Kontrolle darüber übernehmen müssen, und es äußerst wichtig ist, dass Sie nicht wissen, dass Sie die Sitzung schließen müssen und der Prozess bereits ausgeführt wird, haben Sie kein Glück, wenn Sie haben bash als Shell verwendet

Zuerst müssen Sie den Prozess in den Hintergrund schicken, indem Sie Strg + Z gefolgt von BG% 1 eingeben (die Nummer hängt von der Auftragsnummer ab, normalerweise ist es 1, aber Sie können die Liste einfach mit dem Befehl jobs abrufen).

Rufen Sie abschließend den Befehl disown auf (gefolgt von der jobid ... wie beim Befehl bg).

Dadurch wird die Parent-Child-Beziehung zwischen Ihrer Shell und dem Prozess im Hintergrund entfernt und verhindert, dass sie beim Beenden der Shell abstirbt.

Jorge Gutierrez
quelle
2
Diese Antwort ist die beste! Warum redet jeder screen, wurde die Frage nach dem Login gestellt, wie man die Prozesse laufen lässt, nachdem man sich angemeldet hat, aber bevor man sie startet. Großartige Antwort Jorge, du hast mir wirklich geholfen! :)
jwbensley
1
Einfach bg(ohne %1) ist oft genug, da die Standardeinstellung der aktuelle Job ist
Walter Tross
Es wäre schön, eine umfassende Antwort zu haben: A priori (im Voraus einrichten): ASCII-Terminal-Bildschirm (alt), TMUX (neu); X-Fenster: vnc (alt, noch gepflegt), xpra (neuer), wobei xpra rootless ist. A posterior (bleibt bestehen, nachdem Sie angefangen haben): ^ Z, verleugnen Sie, ... Aber ich bin zu faul, um es mehr als das zu konkretisieren.
Krazy Glew
8

Bei einem einzelnen Shell-Skript, das über einen längeren Zeitraum ausgeführt wird, melde ich mich an und führe den Prozess im Hintergrund mit '&' aus.

Beispiel:

/path/to/my/script &

Ich habe mich abgemeldet und meine SSH-Sitzung getrennt. Wenn ich mich später anmelde, wird das Skript immer noch ausgeführt, wie durch die fortlaufende Datenerfassung aus dem Skript belegt.


quelle
3
Ja, ich möchte wissen, wie screen / tmux besser ist als diese einfache Lösung.
Mads Skjern
Ja, ich kann das auch auf meinem Ubuntu sehen, aber theoretisch sollte es nicht passieren. Ich verstehe nicht warum
Daniel Pinyol
1
@MadsSkjern Da Sie mit dieser Methode keine Eingaben in das Skript vornehmen können.
Ken Sharp
1
@MadsSkjern der Grund ist, dass, wenn Sie Prozesse wie diesen ausführen, wenn Sie sich abmelden &und bei Ihrer SSH-Sitzung anmelden, der Prozess weiterhin ausgeführt wird, Sie jedoch die Ausgabe dieses Prozesses nicht sehen können (wenn Ihr Skript etwas von Ihnen wiedergegeben hat) wird es nicht sehen, aber wenn es eine Datei schreibt, wird die Datei dort sein)
DarkCygnus
4

Sie sollten GNU Screen ausprobieren und sehen, ob es Ihnen hilft. Abhängig davon, wie Ihre Anwendung in Echtzeit ausgeführt werden soll, kann dies zu mehr Problemen führen, als es löst. Zumindest können Sie Ihre Sitzung jedoch so fortsetzen, als ob Sie sie nie verlassen hätten.

Wie benutzt man :

  • Verwenden Sie den Befehl screenfür den ersten Start, scrollen Sie durch die Einführungsnachrichten, Sie sollten ein Terminal erhalten.
  • Ca Cc öffnet ein weiteres Terminal
  • Ca Ck tötet ein Terminal
  • Mit Ca C-Space und Ca C-Backspace können Sie durch Terminals blättern
  • Ca Ca ist praktisch, wenn Sie meist nur zwei Terminals verwenden
  • Ca Cd trennt die aktuelle Bildschirmsitzung und beendet die Bildschirme. Sie können dann verwenden screen -r, um diese Sitzung fortzusetzen. Sie können mehrere getrennte Bildschirmsitzungen gleichzeitig durchführen. In diesem Fall wird eine Liste der verfügbaren Sitzungen angezeigt.

Es gibt viele andere Optionen, zum Beispiel geteilte Bildschirme, und alle Verknüpfungen sind vollständig anpassbar.

T. Verron
quelle
3

Einfachste Antwort ...

ctrl + z unterbricht das laufende Programm

"bg" wird es im Hintergrund ausführen

Roop
quelle
5
Ohne den Prozess zu missbilligen (mit so etwas wie disownoder nohup), wird der Prozess normalerweise nach dem Ende der SSH-Sitzung nicht weiter ausgeführt.
Eliah Kagan
3
Auf meinem Ubuntu-Server läuft er mit dem Standard-Setup wirklich weiter!
Mads Skjern
3

Am einfachsten ist es, Ihren Befehl im Hintergrund mit auszuführen &. Dann schreibe einfach:

disown -a
Zibri
quelle
0

Während jeder sagt, zu verwenden disown(die einzige Option, die Sie haben, nachdem Sie den Prozess bereits gestartet haben), nohupoder sogar den Befehl auszuführen screen, was nützlich ist, wenn Sie die gesamte Ausgabe des Befehls sehen möchten ... Ich bin ein Fan von screen.. Ich habe immer noch die neuesten Mainstream-Distributionen von Linux ausprobiert, und wenn ich den Job einfach in den Hintergrund stelle und beende, sterben nicht alle laufenden Prozesse ab. Es muss eine globale Einstellung geben oder so. Ich versuche dies auf einigen ziemlich alten Systemen (Slackware 12) und mein Testskript läuft weiter, bis ich es manuell beende:

shell$ cat > test.pl

#!/usr/bin/perl
while(1){
     sleep(1);
}
    shell$ perl ./test.pl &
    shell$ exit
    logout
    shell$ ps aux test.pl
    mymom 31337     1  0 13:25 ?        00:00:00 perl ./test.pl
    shell$ 

Ich stimme zwar zu, dass screendies der beste Weg wäre, dies auszuführen, selbst wenn mein Skript in Protokolldateien oder was auch immer geschrieben hätte. Ich habe es nie gebraucht disown -a oder nohupes war aus völliger Paranoia heraus. Vielleicht kann jemand etwas Licht ins Dunkel bringen, wie sich Bash standardmäßig verhält? Vielleicht ändern einige Systemadministratoren die Standardeinstellungen für große Shells, um zu verhindern, dass die Prozesse ihrer Benutzer das System überlasten.

Dan Gullage
quelle
Wenn Sie weitere Fragen haben, stellen Sie diese bitte als neue Frage
heemayl
0

Leider kann eine abgebrochene SSH-Sitzung zum Abbruch von tmux oder screen führen. Dies liegt daran, systemddass alle untergeordneten Prozesse beim Abmelden von einer Sitzung beendet werden.

Sie können diese Einstellung in Ihrem logind.conf( /etc/systemd/logind.conf) ändern :

KillUserProcesses=no

Vielen Dank an die Antwort in https://unix.stackexchange.com/questions/490267 .

Jonathan
quelle
-1

Anstatt :

cmd options; 

Hinzufügen vor nohup:

nohup cmd options & 

Dann können Sie die Konsolen-Standardeinstellung folgendermaßen sehen:

tail -f nohup.out
Abdennour TOUMI
quelle