Как мне присоединиться к отдельному сеансу mosh или иным образом избавиться от
Mosh: You have a detached Mosh session on this server (mosh [XXXX]).
то есть, что такое mosh эквивалент
screen -D -R
или возможно
screen -wipe
Кроме того, где этот ответ можно найти в документации?
killall mosh-server
вместо этого? Тем более что pidof и killall на самом деле одно и то же.killall
делает именно то, что говорит.killall mosh-server
вы будете отключены.kill `pidof mosh-server`
вы будете отстранены точно так жеК моему изумлению, я использовал CRIU ( https://criu.org ) для проверки и перезапуска клиента mosh, и это сработало.
Shocking.
Найдите PID вашего mosh-клиента:
Затем установите CRIU в соответствии с их инструкциями.
Затем проверьте это так:
Затем восстановите его:
И вот оно. Ваш клиент mosh вернулся.
Однако следует отметить, что если ваш ноутбук перезагружается (что и является тем, от чего мы пытаемся защитить), mosh использует
monotonic
часы для отслеживания времени на стороне клиента, что не работает при перезагрузках. Это НЕ будет работать, однако, если ваш ноутбук только что вышел из строя, он не будет работать, потому что порядковые номера mosh будут не синхронизированы с версией, которая была проверена (двоичный файл возобновится, но связь прекратится).Чтобы это исправить, вы должны сказать mosh прекратить делать это и загрузить исходный код mosh. Затем отредактируйте этот файл:
Затем найдите
GETTIME
и закомментируйте эту строку.Затем сделайте:
После этого сеансы клиента mosh с контрольными точками CRIU будут перенесены.
(Очевидно, вам нужно было бы написать что-то, чтобы выполнять контрольные точки достаточно регулярно, чтобы быть полезным. Но это упражнение для читателя).
источник
Я понимаю, что это старый пост, но есть очень простое решение для этого, как предлагает Кит Винстейн, автор mosh, здесь: https://github.com/mobile-shell/mosh/issues/394
Сценарий: я вошел на удаленный сервер через mosh. Затем я запустил screen и запустил процесс в сеансе экрана, например, htop. Я теряю связь (умирает батарея ноутбука, теряется сетевое соединение и т. Д.). Я снова подключаюсь через mosh и получаю это сообщение на сервере,
Все, что мне нужно сделать, это убить предыдущую сессию mosh
и присоедините к сеансу экрана, который все еще существует .
Теперь htop (или любой другой запущенный процесс) возвращается так же, как и без прерываний. Это особенно полезно для запуска обновлений или других процессов, которые в случае внезапного прерывания оставляют сервер в грязном, неизвестном состоянии. Я предполагаю, что вы можете сделать то же самое с tmux, хотя я не пробовал. Я полагаю, что именно это предлагали Annihilannic и eskhool.
источник
В дополнение к ответу Варты я использую следующую команду, чтобы закрыть все соединения с mosh, кроме текущего:
pgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) | xargs kill
источник
pgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) && xargs kill || echo "no active sessions to kill"
Как указала @varta, владельцы mosh очень против присоединения от разных клиентов по соображениям безопасности. Так что, если ваш клиент ушел (например, вы перезапустили свой ноутбук), ваш единственный вариант - убить сессии.
Чтобы убить только отдельные сеансы, вы можете использовать следующую строку (которая у меня есть в качестве псевдонима в моем
.bashrc
).Эта команда зависит от того факта, что
who
списки подключенных пользователей, включая сеансы mosh, только присоединенные сеансы mosh имеют «через mosh», и что для сеансов mosh pid указан в квадратных скобках. Таким образом, он находит pids только для отдельных сеансов mosh и передает их для уничтожения с помощью xargs.Вот пример
who
результата для справки:Альтернативой является использование переменной окружения mosh-server
MOSH_SERVER_SIGNAL_TMOUT
. Вы можете установить что-то вроде 300 в вашем.bashrc
на стороне сервера . Тогда, если вы сделаете a,pkill -SIGUSER1 mosh-server
он убьет только те mosh-серверы, которые не были подключены за последние 300 секунд (остальные будут игнорировать SIGUSER1). Больше информации на странице руководства mosh-сервера . Я использую команду выше, потому что после псевдонима это кажется мне проще.Обратите внимание, как упоминало @Annihilannic, если вы используете tmux / screen в своих сеансах mosh, то эти сеансы tmux / screen все еще существуют после того, как вы завершите сеансы mosh. Таким образом, вы все равно можете присоединиться к ним (так что вы действительно не много теряете, убивая сами сеансы mosh).
источник
Ответы здесь, утверждающие, что убийство
mosh-server
является единственным вариантом, в значительной степени устарели, поскольку мы можем использоватьcriu
иreptyr
для восстановления и повторного присоединения произвольных процессов.Не говоря уже о том, что в настоящее время мы можем
kill -USR1 mosh-server
уничтожать отдельные сеансы только чистым и безопасным способом, не прибегая к небезопаснымwho
выводам или громоздким командам, чтобы избежать уничтожения нашего собственного сеанса.Рядом с
criu
ответом Майкла Р. Хайнса есть немного более «легкий»,reptyr
который можно использовать для повторного присоединения процессов, запущенныхmosh-server
(т.е. не самогоmosh-server
себя). Я обычно используюперечислить дерево процессов под отключенным mosh-сервером, а затем
подключить нужный процесс к моему текущему терминалу. После повторения процедуры для всех процессов, которые меня интересуют, я
тогда как я забочусь только о том, чтобы убить сеансы, которые я знаю, мои (общая система).
источник
Unable to attach to pid 10103: Permission denied
Используйте команду ps для получения списка запущенных задач или используйте ps -ef | Греп Мош
Убейте PID mosh с помощью этой команды:
Также, чтобы закрыть все mosh-соединения, вы можете:
Обратите внимание, что если вы в настоящее время подключены через mosh, то это также отключит вас
источник