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?
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.
@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.
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.
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.
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.
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:
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.
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:
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.
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 .
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.
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.
"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.
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.
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.
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:
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:
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.
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 :
Antworten:
Sie sollten nach modernen Alternativen wie suchen
tmux
.tmux
istscreen
aus vielen Gründen überlegen , hier nur einige Beispiele: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:tmux
mit der Eingabetmux
in die Shelltmux
Sitzungtmux
Sitzung, indem Sie Ctrl+ bund dann eingebendSie 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 ihntmux attach
als Anlage zu Ihrertmux
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 sietmux list-sessions
jetzt mit dem Befehl zu einer ausgeführten Sitzung hinzutmux attach-session -t 0
.tmux
kann viel fortgeschrittenere Dinge tun, als ein einzelnes Fenster in einer einzelnen Sitzung zu behandeln. Weitere Informationen finden Sie inman tmux
oder auf der tmux GitHub-Seite . Im Folgenden finden Sie eine FAQ zu den wichtigsten Unterschieden zwischenscreen
undtmux
.quelle
screen -x -r [screenname]
oderscreen -rx
kurz, wenn nur eine Bildschirmsitzung aktiv ist. Auf diese Weise können Sie eine vorhandene Bildschirminstanz anhängen.Ctrl-b
und dannd
, um dietmux
Sitzung zu verlassen / zu trennen . Das gilt natürlich für die Version vontmux
auf meinem Ubuntu 12.04.tmux detach
anstattctrl-b d
Option 1:
nohup
Der beste Weg ist oft der einfachste.
Es wurde speziell dafür gemacht, es protokolliert sogar stdout zu
nohup.log
.Option 2:
bg
Wenn Sie einige bereits ausgeführte Aufgaben im Hintergrund ausführen möchten, sollten Sie Ctrl+ und Zdann ausführen
um die letzte angehaltene Aufgabe in den Hintergrund zu stellen und sie weiter ausführen zu lassen.
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 empfehlenohup
für Aufgaben, von denen Sie wissen, dass Sie sie hinter sich lassen, undbg
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.
quelle
disown -h
bg
+disown
hat 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+z
stoppte den Prozess und brachte mich zurück zu Bash.bg
setzte den Vorgang fort, gab aber auch den Status erneut als Bash aus, sodass ich nicht mehr sehen konnte, was ich eingab. Eindisown
Befehl erzeugte jedoch "disown: current: no such job"julia myFile.jl
aus irgendeinem Grund nicht funktioniert . tmux tut und ist großartig.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.quelle
screen -S name
, um es später einfacher zu machen, die richtige Verbindung herzustellen.screen -S
vor dem Urlaub undscreen -r
bei der Rückkehr ist erstaunlich!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.
Mit disown können Sie das Terminal schließen und den Prozess auf dem Computer ausführen.
quelle
disown -a && exit
disown
und er hat ihn beendet.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:
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):
quelle
disown
Befehl ohne Jobspezifikation aufgerufen wird, wird der aktuellste Hintergrundjob verarbeitet.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:
Mit yum machst du das
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: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:
byobu
Wenn du das nächste Mal kommst, tu es einfach und du sollst wieder da sein, wo du warst.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 .
quelle
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.
quelle
disown
dies erreichen. Siehe @ Bassgeys Antwortdisown
und wenn gerade gebrauchtCtrl-z
, dannbg
um es vom aktiven terminal in den hintergrund zu bekommen. Danndisown
.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.
quelle
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! :)bg
(ohne%1
) ist oft genug, da die Standardeinstellung der aktuelle Job istBei 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:
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
&
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)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 :
screen
für den ersten Start, scrollen Sie durch die Einführungsnachrichten, Sie sollten ein Terminal erhalten.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.
quelle
Einfachste Antwort ...
ctrl + z unterbricht das laufende Programm
"bg" wird es im Hintergrund ausführen
quelle
disown
odernohup
), wird der Prozess normalerweise nach dem Ende der SSH-Sitzung nicht weiter ausgeführt.Am einfachsten ist es, Ihren Befehl im Hintergrund mit auszuführen
&
. Dann schreibe einfach:quelle
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ührenscreen
, was nützlich ist, wenn Sie die gesamte Ausgabe des Befehls sehen möchten ... Ich bin ein Fan vonscreen
.. 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: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 gebrauchtdisown -a
odernohup
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.quelle
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 :Vielen Dank an die Antwort in https://unix.stackexchange.com/questions/490267 .
quelle
Anstatt :
Hinzufügen vor
nohup
:Dann können Sie die Konsolen-Standardeinstellung folgendermaßen sehen:
quelle