Was passiert mit einem fortgesetzten Betrieb, wenn wir ssh ausführen und dann die Verbindung trennen?

10

Ich verschiebe ein Verzeichnis mit dem Befehl mv in ein anderes.

Ich musste jedoch meinen Computer herunterfahren, was bedeutet, dass die Verbindung zum Server unterbrochen wurde.

Was passiert mit dem Befehl mv?

Hinweis: Nach dem erneuten Anmelden habe ich festgestellt, dass alle Dateien ordnungsgemäß verschoben wurden, obwohl ich sicher war, dass sie beim Schließen der Verbindung nicht verschoben wurden. Es scheint, dass mv weiter lief.

Dies ist mir SSH zu Centosh Maschine in Steadfast.net Cloud Server.

user4951
quelle
Ich denke, es wird einen Fehler über die Nichtverfügbarkeit von Quelle / Ziel werfen
SHW
1
Das Verschieben eines Verzeichnisses in ein anderes ist "sofort", wenn sie sich auf derselben Partition befinden. Und selbst wenn Sie Dateien pro Datei verschieben, kann dies schnell gehen. Sind Sie sicher , dass es nach dem Trennen der Verbindung fortgesetzt wurde (anstatt zu beenden, während die verschiedenen SIGHUP-Signale an die untergeordneten Prozesse gesendet werden, was einige Zeit in
Anspruch nehmen kann
als Behelfslösung, Verwendung screenoder tmuxeinmal loggued in ein virtuelles Terminal zu starten , die für den Betrieb wird fortgesetzt , wenn Sie trennen [dh Sie es später anzubringen und das Terminal im gleichen Zustand sehen , wie Sie es verlassen haben , sowie alle Updates in zwischen]
Olivier Dulac

Antworten:

19

Wenn mvgestartet wurde als:

ssh host mv x y

Dann mvwird eine SIGPIPE (und die) erhalten , wenn sie versucht , etwas zu stdout oder stderr zu schreiben (wie eine Fehlermeldung).

Wenn Sie eine interaktive Sitzung gestartet haben wie:

ssh host

Und mvvon der interaktiven Shell dort gestartet , wenn die Masterseite des Pseudo-Terminals, von dem aus gestartet wurde sshd, geschlossen wird (beim sshSchließen der TCP-Verbindung beim Beenden), der Leiter der Sitzung, der der Slave-Seite des Pseudo-Terminals zugeordnet ist ist die interaktive Remote-Shell, die ein SIGHUP-Signal empfängt (auflegen).

Nach dem Empfang dieses Signals trap '' HUPleiten Shells (sofern Sie kein a ausgegeben haben ) dieses Signal normalerweise an alle Prozesse in den Jobs weiter, die sie gestartet haben, es sei denn, Sie haben ausdrücklich angegeben, dass dies nicht der Fall ist (wie bei disownoder mit &|in einigen Shells).

Andere Prozesse (wie mv) sterben normalerweise ab, wenn sie dieses Signal empfangen, es sei denn, sie wurden angewiesen, es zu ignorieren (indem sie es verwenden nohupoder wenn ihre Eltern es ignoriert haben).

Wenn Sie Folgendes ausgegeben haben:

trap '' HUP

Dann werden alle Jobs gestartet, nachdem sie es geerbt haben und SIGHUP ignorieren.

Die Shell stirbt nicht an dem SIGHUP-Signal, das beim Trennen gesendet wird, sondern wird bei der nächsten Eingabeaufforderung beendet, da der Standard weg ist. Beim Beenden senden einige Shells SIGHUP an ihre (nicht abgelehnten) Jobs. Diejenigen, die nach dem beginnen, trap '' HUPwerden es ignorieren, die anderen werden sterben.

Kurz gesagt, in diesem Fall mvstirbt Ihr Wille , es sei denn, Sie haben zuvor Vorsichtsmaßnahmen getroffen, damit dies nicht geschieht .

Um es beim nächsten Mal zu vermeiden, bei Verwendung tcsh, zshoder bash, bevor Sie das Gerät herunterzufahren, drücken Sie Ctrl-Zzu suspendieren mv, geben Sie bges im Hintergrund fortzusetzen und enteignen es.disown

Oder Sie könnten screenoder verwenden tmux. Bei einem SIGHUP werden diese nur von ihrem jetzt verschwundenen Host-Terminal getrennt, aber die Anwendungen, die auf dem emulierten Terminal ausgeführt werden, werden weiterhin kopflos ausgeführt, und Sie können die Sitzung später erneut an ein anderes Terminal anschließen, um zu sehen, wie es gelaufen ist mv.

Oder verwenden Sie nohup mv, um mvgegen SIGHUP immun zu werden und die Ausgabe und Fehler in eine nohup.outDatei zu verschieben, die Sie später überprüfen können.

Jetzt weiß ich nichts über Ihren spezifischen Hosting-Anbieter, aber bei einigen, wenn Sie sich sshin der Instanz befinden, starten Sie dort keine Shell-Sitzungen, sondern verbinden sich mit der Konsole, dh mit einer Sitzung, die bereits gestartet wurde und wenn Sie beenden, beenden Sie diese Sitzung nicht, sondern trennen Sie sie einfach von ihr. Die Shell wird also weder getötet noch getötet mv. Wenn dies der Fall ist, werden Sie feststellen, dass Sie psvon dort aus pidin zwei getrennten sshSitzungen dasselbe für Ihre Shell erhalten .

Stéphane Chazelas
quelle
Sie sagen also, dass der MV beendet wird. Bitte überprüfen Sie den Hinweis.
user4951
2
+1. Hervorragende Antwort (da es bis ins Detail geht, um zu erklären, was wann passiert).
Olivier Dulac
Ich habe einen Artikel basierend auf Ihren Antworten zusammengestellt . Hoffentlich findet es jemand hilfreich.
X-Yuri