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?
killall mosh-server
tego nie robić? Zwłaszcza, że pidof i killall to i tak to samo.killall
robi dokładnie to , co mówi.killall mosh-server
, zostaniesz rozłączony.kill `pidof mosh-server`
, zostaniesz odłączony tak samoKu 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:
Następnie zainstaluj CRIU zgodnie z ich instrukcjami.
Następnie sprawdź to w ten sposób:
Następnie przywróć go:
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
monotonic
zegara 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:
Następnie wyszukaj
GETTIME
i zakomentuj tę linię.Następnie wykonaj:
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).
źródło
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
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,
Wszystko, co muszę zrobić, to zabić poprzednią sesję mosh
i ponownie dołącz do sesji screen, która nadal istnieje .
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.
źródło
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
źródło
pgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) && xargs kill || echo "no active sessions to kill"
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
).To polecenie zależy od tego, że
who
wyś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
who
wynik w celach informacyjnych:Alternatywą jest użycie zmiennej środowiskowej mosh-server
MOSH_SERVER_SIGNAL_TMOUT
. Możesz ustawić ją na około 300.bashrc
po stronie serwera . Następnie, jeśli to zrobiszpkill -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).
źródło
Odpowiedzi tutaj, które twierdzą, że zabijanie
mosh-server
jest jedyną opcją, są w dużej mierze przestarzałe, ponieważ możemy używaćcriu
i odtwarzaćreptyr
i ponownie łączyć dowolne procesy.Nie wspominając już o tym, że w dzisiejszych czasach możemy
kill -USR1 mosh-server
zabijać odłączone sesje tylko w czysty i bezpieczny sposób, bez uciekania się do niebezpiecznychwho
danych wyjściowych lub kłopotliwych poleceń, aby uniknąć zabijania własnej sesji.Obok
criu
odpowiedzi Michaela R. Hinesa istnieje nieco bardziej „lekki”,reptyr
który można wykorzystać do ponownego przyłączenia procesów zapoczątkowanych przezmosh-server
(tj. Niemosh-server
samego). Zwykle używamaby wyświetlić drzewo procesów na odłączonym serwerze mosh, a następnie
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
podczas gdy dbam o to, aby zabijać tylko sesje, o których wiem, że są moje (system współdzielony).
źródło
Unable to attach to pid 10103: Permission denied
Użyj polecenia ps, aby uzyskać listę uruchomionych zadań lub użyj ps -ef | grep mosh
Zabij mosh PID za pomocą tego polecenia:
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
źródło