Wie verbinde ich mich wieder mit einer getrennten Mosh-Sitzung?

157

Wie kann ich mich wieder an eine getrennte Mosh-Sitzung anschließen oder auf andere Weise loswerden?

Mosh: You have a detached Mosh session on this server (mosh [XXXX]).

dh was ist das Mosh-Äquivalent von

screen -D -R

oder möglicherweise

screen -wipe

Wo ist diese Antwort in der Dokumentation zu finden?

John Baber-Lucero
quelle

Antworten:

197

Aus Sicherheitsgründen können Sie keine erneute Verbindung herstellen, siehe https://github.com/keithw/mosh/issues/394

Verwenden Sie zum Beenden der getrennten Sitzung die in dieser Nachricht angezeigte PID-Nummer (das ist der Teil 'XXXX'). Wenn Sie beispielsweise Folgendes sehen:

Mosh: You have a detached Mosh session on this server (mosh [12345]).

Und kann diesen Befehl ausführen:

kill 12345

Um alle Mosh-Verbindungen zu schließen , können Sie:

kill `pidof mosh-server`

Beachten Sie, dass Sie durch diesen letzten Befehl auch getrennt werden, wenn Sie derzeit über mosh verbunden sind.

Varta
quelle
34
@artfulrobot Da die Möglichkeit besteht, dass die getrennte Sitzung einem Mosh-Client gehört, der irgendwo noch lebt. Mosh-Sitzungen durchstreifen und können durch einen Suspend / Resume-Zyklus (z. B. „Hibernation“) überleben. Das Problem, das mosh nicht (und nicht einfach) lösen kann, besteht darin, zu erkennen, dass der Clientcomputer neu gestartet wurde, ohne die mosh-Sitzung ordnungsgemäß zu schließen.
Binki
7
Gibt es einen Grund, dies nicht zu killall mosh-servertun? Zumal Pidof und Killall sowieso wirklich dasselbe sind.
Jordanien
6
@ Jordan: Auf einigen Systemen (z. B. Solaris) killallwird genau das getan , was es sagt.
Bis auf weiteres angehalten.
4
Wenn Sie über mosh verbunden sind und laufen, werden killall mosh-serverSie getrennt.
0xcaff
1
@ 0xcaff Wenn Sie über Mosh verbunden sind und laufen, werden kill `pidof mosh-server`Sie trotzdem getrennt
David
26

Zu meinem Erstaunen habe ich CRIU ( https://criu.org ) verwendet, um einen Mosh-Client zu überprüfen und neu zu starten, und es hat funktioniert.

Schockierend.

Finden Sie die PID Ihres Mosh-Clients:

$ ps -ef | grep mosh

Installieren Sie dann CRIU gemäß den Anweisungen.

Dann überprüfen Sie es wie folgt:

$ mkdir Checkpoint

$ sudo ./criu dump -D checkpoint -t PID --shell-job

Stellen Sie es dann wieder her:

$ sudo ./criu restore -D checkpoint --shell-job

Und da ist es. Ihr Mosh-Client ist zurück.

Beachten Sie jedoch, dass mosh beim Neustart Ihres Laptops (vor dem wir uns schützen wollen) eine monotonicUhr verwendet, um die Zeit auf der Clientseite zu verfolgen, was bei Neustarts nicht funktioniert. Dies funktioniert jedoch NICHT, wenn Ihr Laptop einfach nur abstürzt, funktioniert es nicht, da die Mosh-Sequenznummern nicht mit der Version synchronisiert sind, auf die geprüft wurde (die Binärdatei wird fortgesetzt, die Kommunikation wird jedoch gestoppt).

Um dies zu beheben, müssen Sie mosh anweisen, dies zu beenden und den mosh-Quellcode herunterzuladen. Bearbeiten Sie dann diese Datei:

cd mosh

vim configure.ac

Suchen Sie dann nach GETTIMEdieser Zeile und kommentieren Sie sie aus.

Dann mach:

autoreconf # oder ./autogen.sh, wenn Sie es gerade zum ersten Mal geklont haben

./konfigurieren

machen

make install

Danach überleben Ihre CRIU-Checkpoint-Mosh-Client-Sitzungen Neustarts.

(Natürlich müssten Sie etwas schreiben, um die Checkpoints regelmäßig genug durchzuführen, um nützlich zu sein. Aber das ist eine Übung für den Leser).

Michael Galaxy
quelle
1
Stellen Sie sicher, dass Sie 'STRG-L' eingeben, um die Ausgabe des Bildschirms nach der Wiederherstellung zu aktualisieren.
Michael Galaxy
6
Gibt es aus purer Neugier einen praktischen Vorteil, wenn ich die fehlende Mosh-Client-Sitzung wiederherstelle? Ich führe tmux auf mosh aus und kann mosh auf dem Client einfach neu starten und den tmux neu verbinden ... gibt es einen anderen Vorteil als cool (was es wirklich wirklich ist!)?
Eskhool
1
Die lange Antwort: github.com/mobile-shell/mosh/issues/394 Die kurze Antwort lautet: Ja: Eine tmux-Sitzung sollte nicht benötigt werden, wenn der mosh-server-Daemon bereits auf dem Zielserver ausgeführt wird. Es lässt nicht nur baumelnde Mosh-Dämonen herumliegen, sondern es ist auch ein weiterer Satz von Tastenanschlägen, die wir gar nicht erst eingeben müssen.
Michael Galaxy
1
Mosh ist (in einigen Fällen) ein Ersatz für SSH, nicht für Bildschirm. quoth keithw (mosh author) auf github
törzsmókus
19

Mir ist klar, dass dies ein alter Beitrag ist, aber es gibt eine sehr einfache Lösung dafür, wie von Keith Winstein, Mosh-Autor, hier vorgeschlagen: https://github.com/mobile-shell/mosh/issues/394

"Nun, zunächst einmal, wenn Sie die Möglichkeit haben möchten, eine Verbindung von mehreren Clients zu einer Sitzung herzustellen (oder nachdem der Client gestorben ist), sollten Sie screen oder tmux verwenden. Mosh ist (in einigen Fällen) ein Ersatz für SSH, nicht für screen. Viele Mosh-Benutzer verwenden es zusammen mit dem Bildschirm und mögen es so. "

Szenario: Ich bin über mosh bei einem Remote-Server angemeldet. Ich habe dann screen ausgeführt und einen Prozess in der Bildschirmsitzung ausgeführt, z. B. htop. Ich verliere die Verbindung (der Akku des Laptops ist leer, die Netzwerkverbindung ist verloren gegangen usw.). Ich verbinde mich wieder über mosh und erhalte diese Nachricht auf dem Server.

Mosh: Sie haben eine getrennte Mosh-Sitzung auf diesem Server (mosh [XXXX]).

Alles was ich tun muss, ist die vorherige Mosh-Sitzung zu beenden

töte XXXX

und erneut mit der Bildschirmsitzung verbinden, die noch vorhanden ist .

Bildschirm -r

Jetzt ist htop (oder welcher Prozess auch immer ausgeführt wurde) wieder so, wie es ohne Unterbrechung war. Dies ist besonders nützlich, um Upgrades oder andere Prozesse auszuführen, die den Server in einem unordentlichen, unbekannten Zustand belassen würden, wenn er plötzlich unterbrochen würde. Ich gehe davon aus, dass Sie dasselbe mit tmux tun können, obwohl ich es nicht ausprobiert habe. Ich glaube, das haben Annihilannic und eskhool vorgeschlagen.

007
quelle
2
Dies ist eine großartige Antwort. Vielen Dank, und ja, ich habe bestätigt, dass es mit tmux genauso funktioniert.
Laughing_man
10

Als Ergänzung zu Vartas Antwort verwende ich den folgenden Befehl, um alle Mosh-Verbindungen außer der aktuellen zu schließen:

pgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) | xargs kill

Alexander Burmak
quelle
Falls es keine alte Mosh-Sitzung gibt, gibt xkill einen Fehler aus. Bessere Verwendungpgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) && xargs kill || echo "no active sessions to kill"
rubo77
4

Wie @varta betonte, sind die Mosh-Besitzer aus Sicherheitsgründen sehr dagegen, von verschiedenen Clients erneut eine Verbindung herzustellen. Wenn Ihr Client nicht mehr verfügbar ist (z. B. wenn Sie Ihren Laptop neu gestartet haben), können Sie die Sitzungen nur beenden.

Um nur getrennte Sitzungen zu beenden, können Sie die folgende Zeile verwenden (die ich als Alias ​​in meinem habe .bashrc).

who | grep -v 'via mosh' | grep -oP '(?<=mosh \[)(\d+)(?=\])' | xargs kill

Dieser Befehl hängt von der Tatsache ab, dass whoverbundene Benutzer einschließlich Mosh-Sitzungen aufgelistet werden, nur angehängte Mosh-Sitzungen "via mosh" haben und dass MID-Sitzungen ihre PID in eckigen Klammern haben. Es findet also die Pids nur für die getrennten Mosh-Sitzungen und übergibt sie, um sie mit xargs zu töten.

Hier ist ein Beispielergebnis whoals Referenz:

$ who
theuser    pts/32       2018-01-03 08:39 (17X.XX.248.9 via mosh [193891])
theuser    pts/17       2018-01-03 08:31 (17X.XX.248.9 via mosh [187483])
theuser    pts/21       2018-01-02 18:52 (mosh [205286])
theuser    pts/44       2017-12-21 13:58 (:1001.0)

Eine Alternative ist die Verwendung der Umgebungsvariablen mosh-server MOSH_SERVER_SIGNAL_TMOUT. Sie können es .bashrcauf der Serverseite auf etwa 300 einstellen . Wenn Sie dies tun pkill -SIGUSER1 mosh-server, werden nur Mosh-Server getötet, die in den letzten 300 Sekunden nicht verbunden wurden (die anderen ignorieren den SIGUSER1). Weitere Informationen finden Sie in der Manpage zu mosh-server . Ich verwende den obigen Befehl, weil er mir nach dem Aliasing einfacher erscheint.

Beachten Sie, wie von @Annihilannic erwähnt, dass diese tmux / screen-Sitzungen nach dem Beenden der Mosh-Sitzungen immer noch verfügbar sind, wenn Sie tmux / screen in Ihren Mosh-Sitzungen verwenden. Sie können sich also immer noch an sie binden (damit Sie wirklich nicht viel verlieren, wenn Sie die Mosh-Sitzungen selbst beenden).

studgeek
quelle
3

Die Antworten hier, in denen behauptet wird, dass das Töten mosh-serverdie einzige Option ist, sind weitgehend veraltet, da wir willkürliche Prozesse verwenden criuund reptyrwiederherstellen können.

Ganz zu schweigen davon, dass wir heutzutage kill -USR1 mosh-servernur getrennte Sitzungen auf saubere und sichere Weise beenden können, ohne auf unsichere whoAusgaben oder umständliche Befehle zurückgreifen zu müssen , um zu vermeiden, dass unsere eigene Sitzung beendet wird.

Neben der criuAntwort von Michael R. Hines gibt es das etwas "leichtere", mit reptyrdem Prozesse, die von mosh-server(dh nicht von sich mosh-serverselbst) gestartet wurden, wieder verbunden werden können . Ich benutze normalerweise

pstree -p <mosh-server PID>

um den Prozessbaum unter dem getrennten Mosh-Server aufzulisten, und dann

reptyr PID

um den gewünschten Prozess wieder an mein aktuelles Terminal anzuschließen. Nachdem ich den Vorgang für alle Prozesse wiederholt habe, die mir wichtig sind, habe ich

kill -USR1 <mosh-server PID>

Ich achte darauf, nur Sitzungen zu beenden, von denen ich weiß, dass sie mir gehören (gemeinsames System).

Irfy
quelle
Ich bekommeUnable to attach to pid 10103: Permission denied
rubo77
-1

Verwenden Sie den Befehl ps , um die Liste der ausgeführten Aufgaben abzurufen, oder verwenden Sie ps -ef | grep mosh

Töte die Mosh PID mit diesem Befehl:

kill <pid>

Um alle Mosh-Verbindungen zu schließen, können Sie:

Beachten Sie, dass Sie auch dadurch getrennt werden, wenn Sie derzeit über mosh verbunden sind

kill `pidof mosh-server`
Pankaj Chauhan
quelle