Wie behalte ich Prozesse nach dem Beenden von ssh-Sitzung?

495

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?

    
Olivier Lalonde 21.10.2010, 14:09

14 Antworten

582

Sie sollten nach modernen Alternativen wie tmux suchen.

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

  • Windows kann zwischen Sitzungen verschoben und sogar mit mehreren Sitzungen verknüpft werden
  • Windows kann horizontal und vertikal in Bereiche aufgeteilt werden
  • Unterstützung für UTF-8 und 256 Farbterminals
  • 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 Antwort beschrieben zu erhalten, die screen empfiehlt, müssen Sie Folgendes tun:

  • ssh in die entfernte Maschine
  • Starten Sie tmux , indem Sie tmux in die Shell
  • eingeben
  • Starten Sie den gewünschten Prozess in der gestarteten tmux session
  • Verlassen / Trennen der tmux -Sitzung durch Eingabe von Strg + b und dann d

Sie können sich jetzt sicher vom entfernten Rechner abmelden, Ihr Prozess läuft weiter in tmux . Wenn Sie wiederkommen und den Status Ihres Prozesses überprüfen möchten, können Sie tmux attach verwenden, um an Ihre tmux -Sitzung anzuhängen.

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

tmux kann wesentlich komplexere Dinge tun als ein einzelnes Fenster in einer einzigen Sitzung zu bearbeiten. Weitere Informationen finden Sie in man tmux oder auf der tmux GitHub-Seite . Insbesondere hier ist eine FAQ zu den Hauptunterschieden zwischen screen und tmux .

    
tongpu 23.11.2012, 10:26
211

Der beste Weg ist oft der einfachste.

nohup long-running-command &

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

man nohup

Wenn Sie bereits laufende Aufgaben "im Hintergrund" ausführen möchten, ist es am besten, Strg + z zu drücken und dann

auszuführen

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

Dann sollte ein schneller disown den Prozess nach dem Abmelden weiterlaufen lassen.

screen und andere können es, aber dafür sind sie nicht da. Ich empfehle nohup für Aufgaben, von denen Sie wissen, dass sie zurückbleiben werden, und bg für Aufgaben, die bereits ausgeführt werden und nicht neu gestartet werden sollen.

Beachten Sie, dass beide Bash-spezifisch sind. Wenn Sie nicht Bash verwenden, können die Befehle anders sein.

    
coteyr 28.11.2012 03:58
178

Das könntest du mit screen machen.

Geben Sie man screen ein, um mehr zu erfahren oder lesen Sie diese Bildschirmmanpage .

Einfaches Szenario:

  • ssh in Ihre Remote-Box. Geben Sie screen ein. Starten Sie dann den gewünschten Prozess.

  • Drücken Sie Strg - A 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 wiederkommen möchten, melden Sie sich erneut an und geben Sie screen -r ein. Dies wird Ihre Bildschirmsitzung "fortsetzen" und Sie können die Ausgabe Ihres Prozesses sehen.

Lincoln 21.10.2010 14:20
72

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 entfernen Sie jede jobspec aus der Tabelle der aktiven Jobs. Wenn die Option -h angegeben wird, wird der Job nicht aus der Tabelle entfernt, sondern markiert, sodass SIGHUP nicht an den Job gesendet wird, wenn die Shell eine SIGHUP empfängt. Wenn jobspec nicht vorhanden ist und weder die Option -a noch die Option -r angegeben wird, wird der aktuelle Job verwendet. Wenn keine jobspec angegeben wird, bedeutet die Option -a , alle Jobs zu entfernen oder zu markieren. Das Argument -r ohne jobspec beschränkt die Operation auf laufende Jobs.

Mit enter können Sie das Terminal schließen und den Prozess auf dem Rechner laufen lassen.

    
bassgey 21.10.2010 15:19
37

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 dem laufenden Prozess zu beenden, indem ich im Wesentlichen die folgenden Schritte durchführe:

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

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.

    
Chaos 25.11.2013 04:30
19

Es gibt zwei Hauptprogramme, mit denen Sie Programme und den Terminalstatus über mehrere SSH-Verbindungen verwalten können. Sie sind Bildschirm (der etablierte, aber leider nicht gepflegt. Offenbar wird jetzt aktiv entwickelt ) 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 einer Debian-basierten Maschine installiert werden:

sudo aptitude install byobu

Mit yum machst 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 byobu auf dem Host-Rechner nach dem Verbinden mit ssh ausführen. Dadurch erhalten Sie eine Shell, die wie folgt aussieht:

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 byobu eingeben.

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.

Der beste Teil von 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 zum Hintergrund senden und das nächste Mal, wenn Sie kommen, wieder aufnehmen:

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

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

Sie können viel mehr mit Byobu tun. Benutze es! Einige definitive Anleitungen sind hier , hier oder hier .

    
SiddharthaRT 24.11.2012 23:09
16

Sie können dies nicht tun, wenn der Prozess einmal gestartet ist. Sie müssen die Einrichtung eingerichtet haben, bevor Sie einen lang laufenden Job 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 Dinge trennen und verlassen können Laufen.

Der Bildschirm hat den Vorteil, dass Sie sich von einer Maschine trennen und von einer anderen 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 usw. dar. 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.

    
Richard Holloway 21.10.2010 14:16
7

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 Ihr einziger Vorteil darin besteht, dass der Prozess läuft und Sie nicht die Kontrolle davon übernehmen müssen, und absolut am wichtigsten ist, dass Sie nicht wussten, dass Sie die Sitzung schließen müssen und der Prozess bereits läuft, sind Sie nicht wenn du Bash als Shell benutzt hast

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 Jobnummer ab, normalerweise ist es 1, aber Sie können die Liste einfach mit den Befehlsjobs ziehen)

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

Dadurch wird die Eltern-Kind-Beziehung zwischen Ihrer Shell und dem Prozess im Hintergrund entfernt, sodass sie nicht mehr stirbt, wenn Ihre Shell beendet wird.

    
Jorge Gutierrez 06.06.2011 23:29
7

Für ein einzelnes Shell-Skript, das ich über einen langen Zeitraum ausgeführt habe, melde ich mich an und führe den Prozess im Hintergrund mit '& amp;' durch.

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.

    
user108430 29.07.2014 16:58
3

Sie sollten GNU-Bildschirm überprüfen und sehen, ob es Ihnen hilft. Je nachdem, wie Sie Ihre Anwendung in Echtzeit ausführen müssen, kann dies zu mehr Problemen führen, als sie lösen, aber zumindest können Sie Ihre Sitzung so fortsetzen, als ob Sie sie nie verlassen hätten.

Wie zu verwenden:

  • Verwenden Sie den Befehl screen für den ersten Start, scrollen Sie durch die Einleitungsnachrichten, Sie sollten ein Terminal erhalten.
  • C-a C-c öffnet ein anderes Terminal
  • C-a C-k tötet ein Terminal
  • Sie können C-a C-Space und C-a C-Backspace verwenden, um durch die Terminals zu blättern
  • C-a C-a ist praktisch, wenn Sie hauptsächlich nur zwei Terminals verwenden
  • C-a C-d trennt die aktuelle Bildschirmsitzung und beendet die Bildschirme. Sie können dann screen -r verwenden, um diese Sitzung fortzusetzen. Sie können mehrere getrennte Bildschirmsitzungen gleichzeitig haben. In diesem Fall wird eine Liste der verfügbaren Sitzungen angezeigt.

Es gibt viele andere Optionen, z. B. geteilte Bildschirme, und auch alle Verknüpfungen sind vollständig anpassbar.

    
T. Verron 22.05.2012 17:31
2

Einfachste Antwort ...

ctrl + z unterbricht das laufende Programm

"bg" führt es im Hintergrund aus

    
Roop 13.08.2013 02:28
2

Am einfachsten führen Sie Ihren Befehl im Hintergrund mit & aus. Dann schreibe einfach:

disown -a
    
Zibri 11.01.2017 04:52
0

Während alle sagen, disown zu verwenden (die einzige Option, die Sie haben, nachdem Sie den Prozess bereits gestartet haben), nohup oder sogar den Befehl in screen , was nützlich ist, wenn Sie die gesamte Ausgabe sehen wollen von dem Befehl ... Ich bin ein Fan von screen . Ich habe immer noch die neuesten Mainstream-Distributionen von Linux ausprobiert und einfach den Job in den Hintergrund zu stellen und zu beenden, führt nicht dazu, dass alle laufenden Prozesse sterben. Es muss eine globale Einstellung oder etwas geben. Ich versuche das auf einigen ziemlich alten Systemen (Slackware 12) und mein Testskript läuft weiter, bis ich es manuell abbringe:

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 screen der beste Weg wäre, dies auszuführen, selbst wenn mein Skript in Protokolldateien geschrieben hat oder was auch immer .. Ich musste nie disown -a oder nohup verwenden, außer es war nicht komplette Paranoia. Vielleicht kann jemand etwas Licht in das Verhalten von bash bringen? Vielleicht ändern einige Systemadministratoren die Standardeinstellungen für große Shells, um zu verhindern, dass die Prozesse ihrer Benutzer das System überlasten.

    
Dan Gullage 29.07.2015 19:42
-1

Anstelle von:

cmd options; 

Vor nohup hinzufügen:

nohup cmd options & 

Dann werden Sie in der Lage sein, die Konsolen-Standardausgabe zu sehen:

tail -f nohup.out
    
Abdennour TOUMI 22.10.2016 12:51

Tags und Links