Як я повторно приєднаюся до окремого сеансу mosh?


157

Як я повторно приєднаюся до окремої сесії mosh або позбуюся іншим способом

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

тобто, що таке еквівалент mosh

screen -D -R

або, можливо,

screen -wipe

Крім того, де цю відповідь можна знайти в документації?

Відповіді:


197

З міркувань безпеки не можна повторно вкласти файли, див. Https://github.com/keithw/mosh/isissue/394

Щоб знищити відокремлений сеанс, використовуйте номер PID, відображений у цьому повідомленні (це частина "XXXX". Наприклад, якщо ви бачите -

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

І може виконати цю команду:

kill 12345

Крім того, щоб закрити всі мош-з'єднання, ви можете:

kill `pidof mosh-server`

Зауважте, що якщо ви зараз підключені через mosh, ця остання команда також відключить вас.


34
@artfulrobot Тому що є ймовірність, що відокремлений сеанс належить мош-клієнту, який ще десь живе. Сеанси Mosh бродять і можуть вижити за допомогою призупинення / відновлення (наприклад, «Спячий режим») циклу. Проблема mosh не вирішується (і не може бути легко) - це виявлення того, що клієнтська машина перезапущена без витонченого закриття сеансу mosh.
binki

7
Чи є причина не killall mosh-serverнатомість? Тим більше, що підоф і кіллалл - це все одно те саме.
Йорданія

6
@Jordan: В деяких системах (Solaris, наприклад), killallробить саме те , що він говорить.
Призупинено до подальшого повідомлення.

4
Якщо ви підключились через mosh і працюєте, killall mosh-serverвас відключать.
0xcaff

1
@ 0xcaff, якщо ви підключитесь до mosh і запустіть, kill `pidof mosh-server`ви будете від'єднані точно так само
Девід,

26

На мій подив, я використав CRIU ( https://criu.org ), щоб перевірити та перезапустити mosh-клієнт, і він спрацював.

Шокуюча.

Знайдіть PID вашого клієнта:

$ ps -ef | греп мош

Потім встановіть CRIU відповідно до їх інструкцій.

Потім перевірте так:

КПП $ mkdir

$ sudo ./criu dump -D контрольна точка -t PID - оболонка-робота

Потім відновіть його:

$ sudo ./criu відновити -D контрольно-пропускний пункт - оболонка-завдання

І ось воно є. Ваш клієнт mosh повернувся.

Однак слід зазначити, що якщо ваш ноутбук перезавантажиться (в чому полягає вся суть того, від чого ми намагаємося захистити), mosh використовує monotonicгодинник для відстеження часу на стороні клієнта, що не працює через перезавантаження. Це НЕ буде працювати, однак, якщо ваш ноутбук просто вирівняється з ладу, він не працюватиме, оскільки послідовні номери мош не будуть синхронізовані з версією, яка була перевірена (двійковий файл відновиться, але зв’язок припиниться).

Для того, щоб виправити це, вам потрібно сказати mosh, щоб припинити це робити та завантажити вихідний код mosh. Потім відредагуйте цей файл:

cd mosh

vim configure.ac

Потім знайдіть GETTIMEі прокоментуйте цей рядок.

Потім зробіть:

autoreconf # або ./autogen.sh, якщо ви вперше його клонували

./ конфігурація

зробити

зробити встановлення

Після цього ваші мошенні клієнтські сесії, перевірені CRIU, переживуть перезавантаження.

(Очевидно, що вам потрібно буде написати щось, щоб виконувати контрольні пункти досить регулярно, щоб бути корисними. Але це вправа для читача).


1
Обов'язково введіть "CTRL-L", щоб оновити вихідний екран після відновлення.
Майкл Галактика

6
З великої цікавості, чи є практична користь відновити сеанс клієнта mosh, який я пропускаю? Я запускаю tmux на mosh і можу просто перезапустити mosh на клієнті та знову підключити tmux ... чи є користь робити це інше, ніж його круто (що це насправді є!)?
eskhool

1
Довга відповідь: github.com/mobile-shell/mosh/isissue/394 Коротка відповідь: так: Не потрібно мати сеанс tmux, якщо демон-сервер mosh вже працює на цільовому сервері. Він не тільки залишає звисаючі демони моху, що лежать навколо, але й інший набір натискань клавіш, який нам не слід було б набирати в першу чергу.
Майкл Галактика

1
Mosh - це заміна (в деяких випадках) для SSH, а не для екрана. quoth keithw (автор mosh) на github
törzsmókus

19

Я усвідомлюю, що це стара публікація, але є дуже просте рішення цього питання, як запропонував Кіт Уінштейн, автор моше, тут: https://github.com/mobile-shell/mosh/isissue/394

"Ну, по-перше, якщо ви хочете можливість приєднатися до сеансу від декількох клієнтів (або після того, як клієнт помер), ви повинні використовувати екран або tmux. Mosh є замінником (в деяких випадках) SSH, а не екраном. Багато користувачів Mosh використовують його разом із екраном і їм це подобається ».

Сценарій: Я входжу на віддалений сервер через mosh. Потім я запустив екран і маю, наприклад, процес, що працює на екрані, htop, наприклад. Я втрачаю зв’язок (батарея ноутбука гине, втрачається мережеве з'єднання тощо). Я знову підключаюся через mosh і отримую це повідомлення на сервері,

Mosh: у вас є окремий сеанс Mosh на цьому сервері (mosh [XXXX]).

Все, що мені потрібно зробити, - це вбити попередній сеанс mosh

вбити XXXX

і повторно приєднати до екранного сеансу, який досі існує .

екран -r

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


2
Це чудова відповідь. Дякую, і так, я підтвердив, що він працює так само з tmux.
laughing_man

10

Як додаток до відповіді Варти, я використовую наступну команду, щоб закрити всі мош-з'єднання, крім поточного:

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


У випадку, якщо старого сеансу mosh не буде, xkill видасть помилку. Краще використовуватиpgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) && xargs kill || echo "no active sessions to kill"
rubo77

4

Як зазначав @varta, власники шалених радників дуже проти повторного звернення до клієнтів з міркувань безпеки. Тож якщо ваш клієнт пішов (наприклад, ви перезапустили ноутбук), ваш єдиний варіант - вбити сеанси.

Для вбивства лише відокремлених сеансів ви можете використовувати наступний рядок (який у мене є псевдонімом у моєму .bashrc).

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

Ця команда залежить від того, що whoсписки підключених користувачів, включаючи сеанси mosh, лише додані сеанси mosh мають "через mosh", і що сесії mosh мають свій pid у квадратних дужках. Таким чином, він знаходить під-файли для лише відокремлених сеансів 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-сервера MOSH_SERVER_SIGNAL_TMOUT. Ви можете встановити його на що - щось на зразок 300 в вашому .bashrcна стороні сервера . Тоді якщо ви це зробите, pkill -SIGUSER1 mosh-serverце знищить лише mosh-сервери, які не були підключені протягом останніх 300 секунд (інші ігнорують SIGUSER1). Більше інформації на сторінці mosh-server man . Я використовую команду вище, тому що, як тільки вона з'явилася, мені здається простішою.

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


3

Відповіді, що стверджують, що вбивство mosh-serverє єдиним варіантом, значною мірою застаріли, оскільки ми можемо використовувати criuі reptyrвідновити та повторно застосувати довільні процеси.

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

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

pstree -p <mosh-server PID>

перелічити дерево процесів під відокремленим mosh-сервером, а потім

reptyr PID

щоб приєднати потрібний процес до мого поточного терміналу. Після повторення процедури для всіх процесів, які мене цікавлять, я

kill -USR1 <mosh-server PID>

тоді як я дбаю лише про те, щоб убивати сеанси, які я знаю, що це мої (спільна система).


Я отримуюUnable to attach to pid 10103: Permission denied
rubo77

-1

Використовуйте команду ps для отримання списку запущених завдань або використовуйте ps -ef | греп мош

Вбийте Push-код, використовуючи цю команду:

kill <pid>

Крім того, щоб закрити всі мош-з'єднання, ви можете:

Зауважте, що якщо ви зараз підключені через mosh, це також відключить вас

kill `pidof mosh-server`
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.