Как подключиться к сеансу отдельного сеанса mosh?

Как подключиться к отдельной сеансу mosh или иначе избавиться от

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

то есть. что эквивалентно mosh

screen -D -R

или, возможно,

screen -wipe

Кроме того, где этот ответ можно найти в документации?

Ответ 1

Из соображений безопасности вы не можете повторно подключиться, см. https://github.com/keithw/mosh/issues/394

Чтобы убить отдельный сеанс, используйте номер PID, отображаемый в этом сообщении (часть "XXXX".) Например, если вы видите -

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

И можно запустить эту команду:

kill 12345

Кроме того, чтобы закрыть все мош-соединения, вы можете:

kill `pidof mosh-server`

Обратите внимание, что если вы в настоящее время подключены через mosh, эта последняя команда также отключит вас.

Ответ 2

К моему удивлению, я использовал CRIU (https://criu.org) на контрольную точку и перезапустил mosh-клиент, и он сработал.

Шокирующая.

Найдите PID вашего mosh-клиента:

$ps -ef | grep mosh

Затем установите CRIU в соответствии с их инструкциями.

Затем выполните контрольную точку так:

$контрольная точка mkdir

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

Затем верните его:

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

И вот оно. Ваш mosh-клиент вернулся.

Следует отметить, однако, что если ваш ноутбук перезагружается (что является целым для того, что мы пытаемся защитить от него), mosh использует часы monotonic для отслеживания времени на стороне клиента, что doesn Не работает перезагрузка. Это НЕ будет работать, однако, если ваш ноутбук просто выйдет из строя, он не будет работать, потому что номера последовательностей mosh будут не синхронизированы с версией, которая была проверена (бинарный файл возобновится, но связь прекратится).

Чтобы исправить это, вам нужно сказать mosh, что бы прекратить это делать и загрузить исходный код mosh. Затем отредактируйте этот файл:

cd mosh

vim configure.ac

Затем выполните поиск GETTIME и закомментируйте эту строку.

Тогда do:

autoreconf # или. /autogen.sh, если вы только что клонировали его в первый раз

./Configure

сделать

сделать установку

После этого ваши клиентские сессии CRYU-checkpointed выживут перезагрузки.

(Очевидно, вам нужно будет писать что-то, чтобы регулярно выполнять контрольные точки, чтобы быть полезным, но это упражнение для читателя).

Ответ 3

Я понимаю, что это старый пост, но есть очень простое решение для этого, как предлагает Кит Винстейн, автор mosh, здесь: https://github.com/mobile-shell/mosh/issues/394

"Ну, во-первых, если вам нужна возможность присоединиться к сеансу от нескольких клиентов (или после того, как клиент умрет), вы должны использовать screen или tmux. Mosh является заменой (в некоторых случаях) SSH, а не screen. Многие пользователи Mosh используют его вместе с экраном, и им это нравится ".

Сценарий: я вошел на удаленный сервер через mosh. Затем я запустил screen и запустил процесс в сеансе экрана, например, htop. Я теряю связь (умирает батарея ноутбука, теряется сетевое соединение и т.д.). Я снова подключаюсь через mosh и получаю это сообщение на сервере,

Mosh: у вас есть отдельный сеанс Mosh на этом сервере (mosh [XXXX]).

Все, что мне нужно сделать, это убить предыдущую сессию mosh

убить ХХХХ

и присоедините к сеансу экрана, который все еще существует.

экран -r

Теперь htop (или любой другой запущенный процесс) возвращается так же, как и без прерываний. Это особенно полезно для запуска обновлений или других процессов, которые в случае внезапного прерывания оставляют сервер в грязном, неизвестном состоянии. Я предполагаю, что вы можете сделать то же самое с tmux, хотя я не пробовал. Я полагаю, что именно это предлагали Annihilannic и eskhool.

Ответ 4

В качестве дополнения к ответу Varta я использую следующую команду для закрытия всех подключений mosh, кроме текущего:

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

Ответ 5

Как указала @varta, владельцы mosh очень против присоединения от разных клиентов по соображениям безопасности. Так что, если ваш клиент ушел (например, вы перезапустили свой ноутбук), ваш единственный вариант - убить сессии.

Чтобы убить только отдельные сеансы, вы можете использовать следующую строку (которая у меня есть в качестве псевдонима в моем .bashrc).

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

Эта команда зависит от того, who перечисляет подключенных пользователей, включая сеансы mosh, только присоединенные сеансы mosh имеют "через mosh", и что у сеансов mosh pid указан в квадратных скобках. Таким образом, он находит pids только для отдельных сеансов mosh и передает их для уничтожения с помощью xargs.

Вот пример, who для справки:

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

Альтернативой является использование переменной окружения MOSH_SERVER_SIGNAL_TMOUT -server MOSH_SERVER_SIGNAL_TMOUT. Вы можете установить что-то вроде 300 в вашем .bashrc на стороне сервера. Затем, если вы сделаете pkill -SIGUSER1 mosh-server он будет убивать только mosh-серверы, которые не были подключены в течение последних 300 секунд (остальные будут игнорировать SIGUSER1). Больше информации на странице руководства mosh-сервера. Я использую команду выше, потому что после псевдонима это кажется мне проще.

Обратите внимание, как упоминало @Annihilannic, если вы используете tmux/screen в своих сеансах mosh, то эти сеансы tmux/screen все еще существуют после того, как вы завершите сеансы mosh. Таким образом, вы все равно можете присоединиться к ним (так что вы действительно не много теряете, убивая сами сеансы mosh).

Ответ 6

Я использую mosh в сочетании с tmux на сервере, чтобы убедиться, что мои сеансы сохраняются в сценарии, когда клиент по какой-то причине умирает, например. принудительная перезагрузка.

P.S. или вы могли бы продолжать использовать экран, если это вам нравится.

Ответ 7

Ответы здесь, утверждающие, что уничтожение mosh-server является единственным вариантом, в значительной степени устарели, поскольку мы можем использовать criu и reptyr для восстановления и повторного присоединения произвольных процессов.

Не говоря уже о том, что в настоящее время мы можем kill -USR1 mosh-server только убивать отдельные сессии в чистом и безопасном способе, не прибегая к небезопасному, who подается на выход или громоздкие команды, чтобы избежать убийств собственной сессии.

Рядом с ответом criu Р. Хайнса на criu есть чуть более "легкий" reptyr который можно использовать для повторного reptyr процессов, запускаемых mosh-server (т.е. не самим mosh-server). Я обычно использую

pstree -p <mosh-server PID>

перечислить дерево процессов под отключенным mosh-сервером, а затем

reptyr PID

подключить нужный процесс к моему текущему терминалу. После повторения процедуры для всех процессов, которые меня интересуют, я

kill -USR1 <mosh-server PID>

тогда как я забочусь о том, чтобы убивать только те сессии, которые я знаю, мои (общая система).

Ответ 8

Используйте команду ps для получения списка запущенных задач или используйте ps -ef | Греп Мош

Убейте PID mosh с помощью этой команды:

kill <pid>

Также, чтобы закрыть все mosh-соединения, вы можете:

Обратите внимание, что если вы в настоящее время подключены через mosh, то это также отключит вас

kill 'pidof mosh-server'