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?
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?
Antworten:
Sie sollten nach modernen Alternativen wie suchen tmux
.
tmux
ist screen
aus vielen Gründen überlegen , hier nur einige Beispiele:
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 Eingabe tmux
in die Shelltmux
Sitzungtmux
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 0
.
tmux
kann viel fortgeschrittenere Dinge tun, als ein einzelnes Fenster in einer einzelnen Sitzung zu behandeln. 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
.
screen -x -r [screenname]
oder screen -rx
kurz, wenn nur eine Bildschirmsitzung aktiv ist. Auf diese Weise können Sie eine vorhandene Bildschirminstanz anhängen.
Ctrl-b
und dann d
, um die tmux
Sitzung zu verlassen / zu trennen . Das gilt natürlich für die Version von tmux
auf meinem Ubuntu 12.04.
tmux detach
anstatt ctrl-b d
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
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 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, 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.
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. Ein disown
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.
screen -S name
, um es später einfacher zu machen, die richtige Verbindung herzustellen.
screen -S
vor dem Urlaub und screen -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.
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.
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):
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.
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 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.
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.
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 .
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.
disown
dies erreichen. Siehe @ Bassgeys Antwort
disown
und wenn gerade gebraucht Ctrl-z
, dann bg
um es vom aktiven terminal in den hintergrund zu bekommen. Dann disown
.
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.
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 ist
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.
&
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.
Einfachste Antwort ...
ctrl + z unterbricht das laufende Programm
"bg" wird es im Hintergrund ausführen
disown
oder nohup
), wird der Prozess normalerweise nach dem Ende der SSH-Sitzung nicht weiter ausgeführt.
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.
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 .
Anstatt :
cmd options;
Hinzufügen vor nohup
:
nohup cmd options &
Dann können Sie die Konsolen-Standardeinstellung folgendermaßen sehen:
tail -f nohup.out