Frage Wie können Prozesse nach dem Beenden der SSH-Sitzung am Laufen gehalten werden?


Nehmen wir an, 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 Remote-Computer ausgeführt werden?


506
2017-10-21 12:09


Ursprung


Verbunden: unix.stackexchange.com/questions/4004/ ... - Anton Tarasenko


Antworten:


Sie sollten nach modernen Alternativen suchen wie tmux.

tmux ist überlegen screen Aus vielen Gründen sind hier nur einige Beispiele:

  • Windows kann zwischen Sitzungen verschoben und sogar mit mehreren Sitzungen verknüpft werden
  • Windows kann horizontal und vertikal in Fensterbereiche aufgeteilt werden
  • Unterstützung für UTF-8- und 256-Farb-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 wie in der Antworten empfehle screen, müssten Sie Folgendes tun:

  • ssh in die entfernte Maschine
  • Anfang tmux durch Eingabe von tmux in die Schale
  • Starten Sie den gewünschten Prozess innerhalb des gestarteten Prozesses tmux Session
  • verlasse / entferne die tmux Sitzung durch Eingabe Strg+b und dann d 

Sie können sich nun sicher von der Remote-Maschine abmelden, Ihr Prozess läuft weiter tmux. Wenn Sie wiederkommen und den Status Ihres Prozesses überprüfen möchten, können Sie ihn verwenden tmux attach anhängen tmux Session.

Wenn mehrere Sitzungen gleichzeitig ausgeführt werden sollen, sollten Sie jede Sitzung mit verwenden Strg+b und $. Sie können eine Liste der aktuell laufenden Sitzungen mit erhalten tmux list-sessions, jetzt an eine laufende Sitzung mit Befehl anhängen tmux attach-session -t 0.

tmux kann viel fortgeschrittenere Dinge tun, als ein einzelnes Fenster in einer einzigen Sitzung zu behandeln. Für weitere Informationen schauen Sie rein man tmux oder die tmux GitHub-Seite. Bestimmtes, Hier ist eine FAQ über die Hauptunterschiede zwischen screen und tmux.


594
2017-11-23 09:26



@CraigM Verwendung screen -x -r [screenname] oder screen -rx kurz, wenn Sie nur eine Bildschirmsitzung aktiv haben. Auf diese Weise können Sie eine vorhandene Bildschirminstanz anhängen. - Lekensteyn
Dieser Rat half mir mit dem gleichen Problem, aber ich denke, es beinhaltet einen Tippfehler. Ich bin mir ziemlich sicher, dass Sie tippen müssen Ctrl-b und dann d um das zu verlassen tmux Session. Sicher ist das der Fall für die Version von tmux auf meinem Ubuntu 12.04. - cxrodgers
Ich habe einen Fehler gemacht, indem ich die obigen Anweisungen befolgt habe. Ich werde es teilen, wenn jemand in den gleichen Fehler fallen könnte: Ich startete tmux in der Schale meines eigenen Computers anstelle der Schale des Ferncomputers. Man muss tmux in der Shell des entfernten Computers starten. - Mert Nuhoglu
Bildschirm wird jetzt wieder entwickelt: lists.gnu.org/archive/html/screen-devel/2014-04/msg00024.html Könnten Sie Ihre Antwort aktualisieren? - muru
Alternativ, lauf tmux detach anstatt zu tippen ctrl-b d - Andrew MacFie


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

Wenn Sie einige bereits ausgeführte Aufgaben "im Hintergrund" sehen möchten, ist es am besten, wenn Sie Strg + Z ausführen

bg (Dies wird Hintergrund Ihrer letzten ausgesetzten Aufgabe, so dass es weiter ausgeführt werden kann)

dann schnell disown sollte den Prozess nach dem Abmelden weiterlaufen lassen.

screen und andere können es tun, aber dafür sind sie nicht da. ich empfehle nohup für Aufgaben, die Sie wissen, werden Sie zurücklassen und bg Für Aufgaben, die bereits ausgeführt werden und nicht neu gestartet werden sollen.

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


217
2017-11-28 02:58



Ich würde empfehlen zu tun disown -h - Michele
Interessant Bildschirm und tmux funktioniert nicht für Bergmann, funktioniert bur Nohup - Yasin Okumuş
bg + disown hat nicht für mich gearbeitet. Ich hatte ein Deployment-Skript ausgeführt, ich habe vergessen, in tmux zu starten, und musste früh für ein Treffen verlassen. Das Skript gibt kontinuierlich den Fortschritt an die Shell aus. ctrl+z stoppte den Prozess und brachte mich zurück zu bash. bg Ich habe den Prozess fortgesetzt, aber es hat auch wieder den Status "Bash" ausgegeben, was es unmöglich machte zu sehen, was ich gerade tippte. Jedoch a disown Kommando produziert "disown: current: kein solcher Job" - BrianHVB


Sie könnten das tun, indem Sie screen.

Art man screen um mehr zu erfahren oder dies zu lesen Bildschirm man Seite.

Einfaches Szenario:

  • ssh in deine Remote-Box. Art screen Dann starte den gewünschten Prozess.

  • Drücken Sie Strg-EIN dann Strg-D. Dies wird Ihre Bildschirmsitzung "trennen", aber Ihre Prozesse laufen lassen. Sie können sich jetzt aus der Remote-Box abmelden.

  • Wenn Sie später zurückkehren möchten, melden Sie sich erneut an und geben Sie ein screen -r Dies wird Ihre Bildschirmsitzung "fortsetzen", und Sie können die Ausgabe Ihres Prozesses sehen.


179
2017-10-21 12:20



Ich werde normalerweise meine Bildschirmsitzungen mit benennen screen -S name um es später einfacher zu machen, sich mit dem richtigen zu verbinden. - David Oneill
Der Link ist nicht erreichbar - Gab是好人
Persönlich arbeite ich an einer Box ohne Paketkontrollsoftware. Nachdem ich ungefähr eine halbe Stunde mit der Erstellung von Abhängigkeiten für TMUX (von denen ich persönlich Erfahrung habe und ähnlich ist) aus der Quelle verbrachte, wurde mir klar, dass der 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 für die Einrichtung benötigen. Danke für diese Antwort :) - Max von Hippel
Kombination mit screen -S vor dem Urlaub und screen -r wenn es zurück kommt, ist erstaunlich! - Meloman
Danke dafür. Diese Lösung funktionierte für mich, während tmux nicht (ich benutze eine Version von Bash für Windows während ssh'ing in eine Linux-Maschine) - Michael Sorensen


Bildschirm und Nohup ist der bessere Weg, aber wenn Sie einen Prozess lösen müssen, der bereits ohne Bildschirm oder Nohup läuft, können Sie disown-Befehl ausführen.

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

Ohne Optionen, entferne alle Jobspez aus der Tabelle der aktiven Jobs. Wenn die -h Option wird angegeben, der Job wird nicht aus der Tabelle entfernt, aber markiert, damit SIGHUP nicht an den Job gesendet wird, wenn die Shell eine SIGHUP erhält. Ob Jobspez ist nicht vorhanden, und weder die -a noch das -r Option wird angegeben, der aktuelle Job wird verwendet. Wenn nein Jobspez geliefert wird, die -a Option bedeutet, alle Jobs zu entfernen oder zu markieren; das -r Option ohne a Jobspez Argument beschränkt die Operation auf laufende Jobs.

Mit dem Verwerfen können Sie das Terminal schließen und den Prozess auf dem Rechner ausführen lassen.


72
2017-10-21 13:19



Dies ist auch meine Lieblingsmethode. Ich benutze häufig disown -a && exit - Stefano Palazzo♦
Perfekt. Dies ist ein schönes Kommando und verdient alle Upvotes! - Greg
Ein Wort der Vorsicht, ich habe einen laufenden Prozess mit Ctrl-Z gestoppt und nicht vor dem Aufruf im Hintergrund gestartet disown und es hat es getötet. - HDave
Kann abstürzen, wenn es in das Terminal schreiben möchte. Das Umleiten der Ausgabe eines laufenden Prozesses ist nicht so einfach. Besser, es richtig mit Nohup zu starten. - jiggunjer
Das ist eine gute Antwort, denn sie beantwortet direkt die Frage. Der Autor der Frage gefragt, was zu tun ist nach Ich habe bereits eine Reihe lang andauernder Befehle ausgeführt. Die meisten dieser Antworten lassen Sie wissen, was zu tun ist Vor Sie führen die Befehle aus. - q0rban


Ich war in einem großen mv stecken, so dass ich nicht in der Lage war, den Prozess zu stoppen, den Bildschirm einzurichten und dann neu zu starten. Ich habe es geschafft, die ssh-Sitzung mit laufendem Prozess zu beenden, indem ich im Wesentlichen die folgenden Schritte durchführte:

  1. ssh [Server]
  2. Befehl
  3. STRG + Z
  4. bg
  5. verleugnen
  6. Ausfahrt

In Schritt 3 wird der aktuelle Prozess angehalten (z. B. mein Befehl 'mv'). Schritt 4 setzt den angehaltenen Prozess in den Hintergrund und setzt ihn fort. Schritt 5 lässt Sie den Prozess verleugnen.


37
2017-11-25 03:30



Built-in sind immer meine erste Wahl :) THX - ken_oy
Diese Antwort sollte als richtig markiert werden. Zu installieren und sich daran zu gewöhnen, das Problem zu lösen, ist übertrieben. - Ulrich-Lorenz Schlüter
Dies ist sehr hilfreich, wenn Sie bereits einen Befehl gestartet haben und der Befehl lange ausgeführt wird. Das Beenden und Starten in einer TMUX-Sitzung benötigt Zeit - Deepali Mittal


Es gibt zwei Hauptprogramme, mit denen Sie Programme und den Terminalstatus über mehrere SSH-Verbindungen verwalten können. Sie sind Bildschirm (der Amtsinhaber, aber leider nicht gepflegt. Offenbar jetzt aktiv entwickelt werden) und tmux (neuer, aktiv gepflegt). Byobu ist ein Frontend, das auf ihren Systemen läuft und zusätzliche Ubuntu-Statusinformationen bietet. Bei neuen Installationen wird tmux als Backend verwendet, wenn Sie eine ältere Installation von byobu und eine bestehende Konfiguration haben, wird das vorherige Backend beibehalten, sei es screen oder tmux.

Byobu

Byobu kann auf dem Computer auf einem Debian-basierten Rechner installiert werden:

sudo aptitude install byobu

Mit yum, das tust du

su -c 'yum install byobu'

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

Verwenden von byobu

Sie können byobu starten, indem Sie laufen byobu auf dem Host-Rechner nach dem Verbinden mit ssh. Dadurch erhalten Sie eine Shell, die wie folgt aussieht:

image-byobu

Sie können das Byobu Terminal auch auf einem Ubuntu-Computer mit der Option -X verwenden und problemlos einen funktionierenden Byobu verwenden.

Verwendung:

Starten Sie byobu indem Sie tippen byobu.

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

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

  • Um byobu zu verlassen und es laufen zu lassen (loslassen), drücken Sie F6.
  • Wenn du das nächste Mal kommst, tu es einfach byobu und du wirst wieder da sein, wo du warst.

    byobu-detach-attach

Sie können auch verschiedene Byobu-Sitzungen erstellen byobu -S session1 und so weiter. Und Sie können sich mit beiden verbinden, wenn Sie zurückkommen.

Sie können viel mehr mit Byobu tun. Benutze es! Einige definitive Führer sind Hier, Hier oder Hier.


19
2017-11-24 22:09



Ich habe versucht, Byobu von einer PuTTY-basierten Sitzung zu meiner Ubuntu-Box zu verwenden, aber ich bekomme die Statuszeile wiederholt und Scrollen auf dem Display. Obwohl es beim Drücken von F6 richtig gelöst wurde, war es in meinem Setup keine brauchbare Lösung. - jfmessier
@jfmessier Es ist, weil PuTTY ncurses (utf-8 grundsätzlich) nicht gut nimmt. Es ist möglich, dieses Problem zu beseitigen, indem Sie diesem Thread folgen - stackoverflow.com/questions/10731099/ ... - SiddharthaRT
Das ist fantastisch! 1. Es gibt mir eine farbige Bash-Eingabeaufforderung, die ich nicht mit Bash als meine Standard-Shell aktivieren kann und 2. Ich kann 2 Bots gleichzeitig ausführen und immer noch habe ein anderes Terminal, um daran zu arbeiten! @SiddharthaRT du verdienst ein upvote sir! - Dev


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

Sie können verwenden Nohup aber moderne Weisheit schlägt vor, dass Sie Bildschirm oder Byobu als Ihr Login verwenden, damit Sie loslassen können und Dinge laufen lassen.

Bildschirm hat den Vorteil, dass Sie sich von einer Maschine trennen und von einer anderen Maschine wieder anhängen können, was praktisch ist, wenn Sie lange laufende Prozesse überprüfen möchten, die über das Ende des Arbeitstages hinausgehen.

Es gibt einen vernünftigen Einstieg Anleitung zum Bildschirm Hier.

Byobu stellt eine einfach zu bedienende Benutzeroberfläche auf dem Bildschirm mit Menüs etc. Es ist auch die aktuelle Implementierung des Bildschirms 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.


16
2017-10-21 12:16



byobu benutzt tmux in diesen Tagen .. - scottl
"Sie können dies nicht tun, sobald der Prozess gestartet wurde, müssen Sie die Dinge eingerichtet haben, bevor Sie einen lang laufenden Job ausführen." - Nein, du kannst es benutzen disown um das zu erreichen. Siehe @ Bassgeys Antwort - Rich
nach dem Kampf um Bildschirm und tmux zu lernen .... byobu brachte Tränen in meine Augen - HDave
disown und wenn nötig nur Ctrl-z, dann bg um es vom aktiven Terminal und in den Hintergrund zu bekommen. Dann, disown. - mimoralea


Hey, während ich zugestimmt habe, dass der Bildschirm die effektivste Option ist. Sie können vncserver verwenden und dann den Prozess darauf starten.

Auch wenn es Ihr einziges Interesse ist, den Prozess laufen zu lassen und keine Kontrolle zurück zu haben, und absolut am wichtigsten, dass Sie nicht wussten, dass Sie die Sitzung schließen müssen und der Prozess bereits läuft, haben Sie kein Glück, wenn Sie haben bash als Shell benutzt

Zuerst müssen Sie den Prozess an den Hintergrund senden, indem Sie Strg + Z gefolgt von bg% 1 eingeben (die Anzahl hängt von der Jobnummer ab, normalerweise ist es 1, aber Sie können die Liste leicht mit den Befehlsjobs ziehen)

Schließlich den Befehl disown aufrufen (gefolgt von der Jobid ... wie bei bg)

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


7
2018-06-06 21:29



Diese Antwort ist die beste! Warum reden alle darüber? screenNach dem Login wurde die Frage gestellt, wie man die Prozesse nach dem Einloggen, aber vor dem Starten der Prozesse, am Laufen hält. Große Antwort Jorge, du hast mir wirklich geholfen! :) - jwbensley
Einfach bg (ohne %1) ist oft genug, da der Standardjob der aktuelle ist - Walter Tross
Es wäre schön, eine umfassende Antwort zu haben: A priori (im Voraus einrichten): ASCII Terminal Bildschirm (alt), tmux (neewer); X Windows: vnc (alt, noch gepflegt), xpra (neuer), wobei xpra wurzelfrei ist. A posterior (fortbestehen, nachdem du angefangen hast): ^ Z, verleugnen, ... Aber ich bin zu faul, es mehr als das zu füllen. - Krazy Glew


Für ein einzelnes Shell-Skript, das ich über einen langen Zeitraum laufen habe, werde ich mich anmelden und den Prozess im Hintergrund mit '&' ausführen.

Beispiel:

/path/to/my/script &

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


7
2017-07-29 14:58



Ja, ich würde gerne wissen, wie screen / tmux besser ist als diese einfache Lösung. - Mads Skjern
Ja, ich kann das auch auf meinem Ubuntu sehen, aber das sollte theoretisch nicht passieren. Ich verstehe nicht warum - Daniel Pinyol
@MadsSkjern Weil Sie mit dieser Methode keine Eingabe in das Skript eingeben können. - Ken Sharp
@MadsSkjern der Grund ist, dass wenn Sie solche Prozesse mit ausführen & Wenn Sie sich bei Ihrer SSH-Sitzung abmelden, wird der Prozess weiterhin ausgeführt Laufen Sie werden jedoch nicht sehen können Ausgabevon diesem Prozess (wenn dein Skript etwas wiedergibt, wirst du es nicht sehen, aber wenn es eine Datei schreibt, wird die Datei dort sein) - DarkCygnus