it-swarm.dev

كيف يمكنني العودة إلى جلسة mosh منفصلة؟

كيف يمكنني العودة إلى جلسة mosh منفصلة أو بطريقة أخرى التخلص منها

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

أي ما يعادل المكافئ

screen -D -R

او ربما

screen -wipe

علاوة على ذلك ، أين يمكن العثور على هذه الإجابة في الوثائق؟

142
John Baber-Lucero

لأسباب أمنية ، لا يمكنك إعادة التوجيه ، راجع https://github.com/keithw/mosh/issues/394

لقتل الجلسة المنفصلة ، استخدم رقم PID المعروض في تلك الرسالة (هذا هو الجزء "XXXX"). على سبيل المثال ، إذا رأيت -

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

ويمكن تشغيل هذا الأمر:

kill 12345

أيضًا ، لإغلاق الكل mosh ، يمكنك:

kill `pidof mosh-server`

لاحظ أنه إذا كنت متصلاً حاليًا عبر mosh ، فسيؤدي هذا الأمر الأخير إلى فصلك أيضًا.

169
varta

لدهشتي ، استخدمت CRIU ( https://criu.org ) لتفقد نقطة وإعادة تشغيل عميل mosh وقد نجحت.

مروع.

ابحث عن PID الخاص بعميل mosh:

$ ps -ef | grep mosh

ثم ، تثبيت CRIU وفقا لتعليماتهم.

ثم ، تحقق من أنها مثل هذا:

حاجز mkdir $

سودو $./تفريغ criu -D نقطة تفتيش -T PID - شل وظيفة

ثم استعادته:

سودو $./كريو استعادة -D نقطة تفتيش - وظيفة شل

و هاهو. عاد عميل mosh الخاص بك.

ومع ذلك ، تجدر الإشارة إلى أنه في حالة إعادة تشغيل الكمبيوتر المحمول (والذي يمثل النقطة الأساسية لما نحاول حمايته) ، يستخدم mosh monotonic لتتبع الوقت على جانب العميل ، والذي لا يعمل عبر إعادة التمهيد . ومع ذلك ، لن ينجح هذا ، إذا تعطل جهاز الكمبيوتر المحمول تمامًا ، فلن يعمل هذا لأن أرقام تسلسل mosh ستكون غير متزامنة مع الإصدار الذي تم فحصه (سيتم استئناف ثنائي ، ولكن سيتوقف الاتصال).

لإصلاح هذا الأمر ، يلزمك إخبار mosh بالتوقف عن القيام بذلك وتنزيل التعليمات البرمجية المصدر mosh. ثم قم بتحرير هذا الملف:

قرص موش

هيم config.ac

ثم ابحث عن GETTIME وقم بالتعليق عليه.

ثم افعل:

autoreconf # أو ./autogen.sh إذا كنت قد استنسخته للتو لأول مرة

./تهيئة

make

جعل تثبيت

بعد ذلك ، ستظل جلسات عمل عميل mosh بفحص CRIU قيد التشغيل.

(من الواضح أنك ستحتاج إلى كتابة شيء لأداء نقاط التفتيش بانتظام بما يكفي لتكون مفيدة. ولكن هذا تمرين للقارئ).

20
Michael R. Hines

أدرك أن هذا منشور قديم ، ولكن يوجد حل بسيط جدًا لهذا ، كما اقترح كيث وينشتاين ، مؤلف كتاب "mosh" ، هنا: https://github.com/mobile-Shell/mosh/issues/394

"حسنًا ، أولاً ، إذا كنت تريد القدرة على إرفاق جلسة من عدة عملاء (أو بعد وفاة العميل) ، يجب عليك استخدام الشاشة أو tmux. Mosh هو بديل (في بعض الحالات) لـ SSH ، وليس للشاشة. العديد من مستخدمي Mosh يستخدمونه مع الشاشة ويعجبهم بهذه الطريقة. "

السيناريو: لقد قمت بتسجيل الدخول إلى خادم بعيد عبر mosh. لقد قمت بعد ذلك بتشغيل الشاشة وتشغيل عملية في جلسة الشاشة ، htop ، على سبيل المثال. أفقد الاتصال (تموت بطارية الكمبيوتر المحمول ، وفقد اتصال الشبكة ، وما إلى ذلك). أقوم بالاتصال مرة أخرى عبر mosh واحصل على هذه الرسالة على الخادم ،

Mosh: لديك جلسة Mosh منفصلة على هذا الخادم (mosh [XXXX]).

كل ما علي فعله هو قتل جلسة الموش السابقة

قتل XXXX

و أعد الوصول إلى جلسة الشاشة ، التي لا تزال موجودة .

الشاشة ص

الآن ، عادت htop (أو أي عملية كانت قيد التشغيل) تمامًا كما كانت دون انقطاع. وهذا مفيد بشكل خاص لتشغيل الترقيات أو العمليات الأخرى التي قد تترك الخادم في حالة فوضى وغير معروفة إذا تمت مقاطعة فجأة. أفترض أنك تستطيع أن تفعل الشيء نفسه مع tmux ، على الرغم من أنني لم أحاول ذلك. أعتقد أن هذا ما اقترحه Annihilannic و eskhool.

12
007

كإضافة إلى إجابة Varta ، استخدم الأمر التالي لإغلاق جميع اتصالات mosh باستثناء الحالي:

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

8
Alexander Burmak

كما أشارvarta ، فإن مالكي mosh يعارضون إعادة الربط من عملاء مختلفين لأسباب أمنية. لذلك إذا رحل عميلك (على سبيل المثال قمت بإعادة تشغيل الكمبيوتر المحمول) ، فإن الخيار الوحيد لك هو قتل الجلسات.

لقتل الجلسات المنفصلة فقط ، يمكنك استخدام السطر التالي (الذي لدي كاسم مستعار في .bashrc).

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

يعتمد هذا الأمر على حقيقة أن who يسرد المستخدمين المتصلين بما في ذلك جلسات mosh ، وجلسات mosh المرفقة فقط لها "عبر mosh" ، وأن جلسات mosh لها معروضها في أقواس مربعة. لذلك يجد الباحثين عن جلسات 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 MOSH_SERVER_SIGNAL_TMOUT. يمكنك ضبطه على شيء مثل 300 في .bashrc على جانب الخادم. ثم إذا قمت بتنفيذ pkill -SIGUSER1 mosh-server ، فسوف يقتل فقط خوادم mosh التي لم تكن متصلاً في آخر 300 ثانية (سيتجاهل الآخرون SIGUSER1). مزيد من المعلومات في صفحة mosh-server man . أنا أستخدم الأمر أعلاه لأنه ، بمجرد الاسم المستعار ، يبدو الأمر أبسط بالنسبة لي.

لاحظ ، كما ذكرAnnihilannic ، إذا كنت تستخدم tmux/screen داخل جلسات mosh الخاصة بك ، فإن جلسات tmux/screen هذه لا تزال موجودة بعد أن تقتل جلسات mosh. لذلك لا يزال بإمكانك الالتحاق بهم (حتى لا تخسر الكثير من خلال قتل جلسات الموش نفسها).

4
studgeek