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


Zur akzeptierten Antwort gehen


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?


668





2010-10-21




Anzahl der Antworten: 15


Sie sollten nach modernen Alternativen wie suchen tmux .

tmux ist screen aus 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 tmux mit der Eingabe tmux in die Shell
  • Starten Sie den gewünschten Vorgang in der gestarteten tmux Sitzung
  • Verlassen / Trennen Sie die tmux Sitzung, 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 attach als Anlage zu Ihrer tmux Sitzung 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-sessions jetzt mit dem Befehl zu einer ausgeführten Sitzung hinzu tmux attach-session -t <session-name> .

tmux Sie können weitaus fortgeschrittenere Aufgaben ausführen, als ein einzelnes Fenster in einer einzelnen Sitzung zu bearbeiten. Weitere Informationen finden Sie in man tmux oder auf der tmux GitHub-Seite . Im Folgenden finden Sie eine FAQ zu den wichtigsten Unterschieden zwischen screen und tmux .


779


2012-11-23

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 Ihre letzte angehaltene Aufgabe in den Hintergrund zu stellen, damit sie weiter ausgeführt werden kann.

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

screen und andere können es, aber dafür sind sie nicht. Ich empfehle nohup für Aufgaben, von denen Sie wissen, dass Sie sie hinter sich lassen werden, und bg fü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.


321


2012-11-28

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 screen Dann 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 -r Damit wird Ihre Bildschirmsitzung "fortgesetzt", und Sie können die Ausgabe Ihres Prozesses sehen.


212


2010-10-21

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 -h Option 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 -a noch die angegeben -r sind, wird der aktuelle Job verwendet. Wenn keine Jobspezifikation angegeben ist, -a bedeutet die Option, dass alle Jobs entfernt oder markiert werden. Die -r Option 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.


86


2010-10-21

Ich saß in einem großen MV fest und war 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 jobs vorher 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.
 

53


2013-11-25

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

Verwendung:

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).
  • byobu Wenn du das nächste Mal kommst, tu es einfach und du solltest zurück 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 .


22


2012-11-24

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 moderne Weisheit schlägt vor, dass Sie screen oder byobu als Ihr Login verwenden, damit Sie die Dinge trennen und 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 usw. 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.


18


2010-10-21

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.


8


2011-06-06

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.


8


2014-07-29

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 screen fü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.


4


2012-05-22

Einfachste Antwort ...

ctrl + z unterbricht das laufende Programm

"bg" wird es im Hintergrund ausführen


3


2013-08-13

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

 disown -a
 

3


2017-01-11

Während jeder sagt, zu verwenden disown (die einzige Option, die Sie haben, nachdem Sie den Prozess bereits gestartet haben), nohup oder 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 screen dies 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 nohup es 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.


0


2015-07-29

Leider kann eine abgebrochene SSH-Sitzung zum Abbruch von tmux oder screen führen. Dies liegt daran, systemd dass 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 .


0


2019-06-23

Anstatt von :

 cmd options; 
 

Hinzufügen vor nohup :

 nohup cmd options & 
 

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

 tail -f nohup.out
 

-1


2016-10-22