Jak mogę ponownie dołączyć do odłączonej sesji mosh?

157

Jak ponownie podłączyć się do odłączonej sesji mosh lub w inny sposób się go pozbyć

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

tj. jaki jest odpowiednik mosh

screen -D -R

lub ewentualnie

screen -wipe

Co więcej, gdzie można znaleźć tę odpowiedź w dokumentacji?

John Baber-Lucero
źródło

Odpowiedzi:

197

Ze względów bezpieczeństwa nie można ponownie podłączyć, patrz https://github.com/keithw/mosh/issues/394

Aby zabić odłączoną sesję, użyj numeru PID wyświetlonego w tej wiadomości (to jest część „XXXX”). Na przykład, jeśli widzisz -

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

I może uruchomić to polecenie:

kill 12345

Ponadto, aby zamknąć wszystkie połączenia mosh, możesz:

kill `pidof mosh-server`

Zauważ, że jeśli jesteś obecnie połączony przez mosh, to ostatnie polecenie również cię rozłączy.

varta
źródło
34
@artfulrobot Ponieważ jest szansa, że ​​odłączona sesja należy do klienta mosh, który wciąż gdzieś żyje. Sesje Mosh wędrują i mogą przetrwać cykl wstrzymania / wznowienia (np. „Hibernacja”). Problem mosh, którego nie można (i nie można łatwo) rozwiązać, polega na wykryciu, że komputer kliencki został uruchomiony ponownie bez wdzięcznego zamknięcia sesji mosh.
binki
7
Czy jest powód, żeby killall mosh-servertego nie robić? Zwłaszcza, że ​​pidof i killall to i tak to samo.
Jordan
6
@Jordan: W niektórych systemach (na przykład Solaris) killallrobi dokładnie to , co mówi.
Wstrzymano do odwołania.
4
Jeśli jesteś połączony przez mosh i uruchomisz killall mosh-server, zostaniesz rozłączony.
0xcaff
1
@ 0xcaff jeśli łączysz się przez mosh i biegniesz kill `pidof mosh-server`, zostaniesz odłączony tak samo
David
26

Ku mojemu zdumieniu użyłem CRIU ( https://criu.org ) do sprawdzenia i ponownego uruchomienia klienta mosh i zadziałało.

Wstrząsający.

Znajdź PID swojego klienta mosh:

$ ps -ef | grep mosh

Następnie zainstaluj CRIU zgodnie z ich instrukcjami.

Następnie sprawdź to w ten sposób:

Punkt kontrolny $ mkdir

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

Następnie przywróć go:

$ sudo ./criu restore -D punkt kontrolny --shell-job

I oto jest. Twój klient mosh powrócił.

Należy jednak zauważyć, że jeśli twój laptop się zrestartuje (a to jest sednem tego, przed czym staramy się chronić), mosh używa monotoniczegara do śledzenia czasu po stronie klienta, który nie działa po ponownym uruchomieniu. To NIE zadziała, jednak jeśli twój laptop po prostu się zawiesza, nie zadziała, ponieważ numery sekwencji mosh nie będą zsynchronizowane z wersją, która była punktem kontrolnym (plik binarny zostanie wznowiony, ale komunikacja zostanie zatrzymana).

Aby to naprawić, musisz powiedzieć moshowi, aby przestał to robić i pobrać kod źródłowy mosh. Następnie edytuj ten plik:

cd mosh

vim configure.ac

Następnie wyszukaj GETTIMEi zakomentuj tę linię.

Następnie wykonaj:

autoreconf # lub ./autogen.sh, jeśli sklonowałeś go po raz pierwszy

./configure

robić

dokonać instalacji

Następnie sesje klienta mosh z punktami kontrolnymi CRIU przetrwają ponowne uruchomienie.

(Oczywiście musiałbyś napisać coś, aby regularnie wykonywać punkty kontrolne, aby były użyteczne. Ale to jest ćwiczenie dla czytelnika).

Michael Galaxy
źródło
1
Pamiętaj, aby wpisać „CTRL-L”, aby odświeżyć ekran po przywróceniu.
Michael Galaxy,
6
Czy z czystej ciekawości istnieje praktyczna korzyść z przywrócenia sesji klienta mosh, której mi brakuje? Uruchamiam tmux na mosh i mogę po prostu ponownie uruchomić mosh na kliencie i ponownie podłączyć tmux ... czy jest coś innego niż to, co fajne (a tak naprawdę jest!)?
eskhool
1
Długa odpowiedź: github.com/mobile-shell/mosh/issues/394 Krótka odpowiedź brzmi: tak: sesja tmux nie powinna być potrzebna, jeśli demon mosh-server już działa na serwerze docelowym. Nie tylko pozostawia wiszące demony mosh leżące wokół, ale jest to kolejny zestaw naciśnięć klawiszy, których nie powinniśmy musieć wpisywać w pierwszej kolejności.
Michael Galaxy,
1
Mosh zastępuje (w niektórych przypadkach) SSH, a nie screen. quoth keithw (autor mosh) na github
törzsmókus
19

Zdaję sobie sprawę, że to stary post, ale istnieje bardzo proste rozwiązanie tego problemu, zgodnie z sugestią Keitha Winsteina, autora mosh, tutaj: https://github.com/mobile-shell/mosh/issues/394

„Cóż, po pierwsze, jeśli chcesz mieć możliwość dołączenia do sesji od wielu klientów (lub po śmierci klienta), powinieneś użyć screen lub tmux. Mosh jest substytutem (w niektórych przypadkach) dla SSH, a nie dla screen. Wielu użytkowników Mosha używa go razem z ekranem iw ten sposób lubi ”.

Scenariusz: jestem zalogowany na zdalnym serwerze przez mosh. Następnie uruchomiłem screen i uruchomiłem proces w sesji screen, na przykład htop. Tracę połączenie (bateria laptopa rozładowuje się, tracę połączenie sieciowe itp.). Łączę się ponownie przez mosh i otrzymuję tę wiadomość na serwerze,

Mosh: Masz odłączoną sesję Mosh na tym serwerze (mosh [XXXX]).

Wszystko, co muszę zrobić, to zabić poprzednią sesję mosh

zabij XXXX

i ponownie dołącz do sesji screen, która nadal istnieje .

ekran -r

Teraz htop (lub jakikolwiek inny działający proces) powraca bez przerwy, co jest szczególnie przydatne w przypadku uruchamiania aktualizacji lub innych procesów, które pozostawiałyby serwer w niechlujnym, nieznanym stanie, gdyby zostały nagle przerwane. Zakładam, że możesz zrobić to samo z tmux, chociaż nie próbowałem tego. Wierzę, że to właśnie sugerowali Annihilannic i eskhool.

007
źródło
2
To świetna odpowiedź. Dziękuję i tak potwierdziłem, że działa tak samo z tmuxem.
laughing_man
10

Jako dodatek do odpowiedzi Varty używam następującego polecenia, aby zamknąć wszystkie połączenia mosh z wyjątkiem bieżącego:

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

Alexander Burmak
źródło
W przypadku, gdy nie ma starej sesji mosh, xkill zgłosi błąd. Lepsze wykorzystaniepgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) && xargs kill || echo "no active sessions to kill"
rubo77
4

Jak zauważył @varta, właściciele mosh są bardzo przeciwni ponownemu podłączaniu się od różnych klientów ze względów bezpieczeństwa. Więc jeśli twój klient zniknął (np. Zrestartowałeś laptopa), jedyną opcją jest zabicie sesji.

Aby zabić tylko odłączone sesje, możesz użyć następującego wiersza (który mam jako alias w moim .bashrc).

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

To polecenie zależy od tego, że whowyświetla listę podłączonych użytkowników, w tym sesje mosh, tylko dołączone sesje mosh mają „via mosh”, a sesje mosh mają swój pid w nawiasach kwadratowych. Znajduje więc pidy tylko dla odłączonych sesji mosh i przekazuje je do zabicia przy użyciu xargs.

Oto przykładowy whowynik w celach informacyjnych:

$ 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)

Alternatywą jest użycie zmiennej środowiskowej mosh-server MOSH_SERVER_SIGNAL_TMOUT. Możesz ustawić ją na około 300 .bashrcpo stronie serwera . Następnie, jeśli to zrobisz pkill -SIGUSER1 mosh-server, zabije tylko serwery mosh, które nie były połączone w ciągu ostatnich 300 sekund (pozostałe zignorują SIGUSER1). Więcej informacji na stronie man mosh-server . Używam powyższego polecenia, ponieważ po aliasowaniu wydaje mi się prostsze.

Uwaga, jak wspomniał @Annihilannic, jeśli używasz tmux / screen w swoich sesjach mosh, te sesje tmux / screen są nadal dostępne po zabiciu sesji mosh. Więc nadal możesz się do nich przywiązywać (więc naprawdę nie tracisz wiele, zabijając same sesje mosh).

studgeek
źródło
3

Odpowiedzi tutaj, które twierdzą, że zabijanie mosh-serverjest jedyną opcją, są w dużej mierze przestarzałe, ponieważ możemy używać criui odtwarzać reptyri ponownie łączyć dowolne procesy.

Nie wspominając już o tym, że w dzisiejszych czasach możemy kill -USR1 mosh-serverzabijać odłączone sesje tylko w czysty i bezpieczny sposób, bez uciekania się do niebezpiecznych whodanych wyjściowych lub kłopotliwych poleceń, aby uniknąć zabijania własnej sesji.

Obok criuodpowiedzi Michaela R. Hinesa istnieje nieco bardziej „lekki”, reptyrktóry można wykorzystać do ponownego przyłączenia procesów zapoczątkowanych przez mosh-server(tj. Nie mosh-serversamego). Zwykle używam

pstree -p <mosh-server PID>

aby wyświetlić drzewo procesów na odłączonym serwerze mosh, a następnie

reptyr PID

aby ponownie dołączyć żądany proces do mojego bieżącego terminala. Po powtórzeniu procedury dla wszystkich procesów, na których mi zależy, ja

kill -USR1 <mosh-server PID>

podczas gdy dbam o to, aby zabijać tylko sesje, o których wiem, że są moje (system współdzielony).

Irfy
źródło
DostajęUnable to attach to pid 10103: Permission denied
rubo77
-1

Użyj polecenia ps, aby uzyskać listę uruchomionych zadań lub użyj ps -ef | grep mosh

Zabij mosh PID za pomocą tego polecenia:

kill <pid>

Ponadto, aby zamknąć wszystkie połączenia mosh, możesz:

Zwróć uwagę, że jeśli jesteś obecnie połączony przez mosh, to również cię rozłączy

kill `pidof mosh-server`
Pankaj Chauhan
źródło