मैं एक अलग mosh सत्र के लिए कैसे reattach करूँ?


157

मैं एक अलग mosh सत्र के लिए कैसे reattach करूं या अन्यथा छुटकारा पाऊं

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

यानी क्या मोश के बराबर है

screen -D -R

या संभवतः

screen -wipe

इसके अलावा, प्रलेखन में यह उत्तर कहां मिल सकता है?

जवाबों:


197

सुरक्षा कारणों से, आप reattach नहीं कर सकते, 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 के माध्यम से जुड़े हुए हैं, तो यह अंतिम कमांड आपको डिस्कनेक्ट कर देगा।


34
@artfulrobot क्योंकि वहाँ एक मौका है कि अलग सत्र एक mosh- क्लाइंट का है जो अभी भी कहीं जीवित है। Mosh सत्र घूमते हैं और एक सस्पेंड / फिर से शुरू (जैसे, "हाइबरनेशन") चक्र के माध्यम से जीवित रह सकते हैं। समस्या mosh (और आसानी से नहीं हो सकता) हल यह पता लगा रहा है कि क्लाइंट मशीन बिना किसी सावधानी के mosh सत्र को बंद किए हुए पुनः आरंभ हो गई है।
बिंकी

7
क्या killall mosh-serverइसके बजाय कोई कारण नहीं है ? खासकर जब से पिडोफ और किंडल वास्तव में वैसे ही हैं।
जॉर्डन

6
@Jordan: कुछ सिस्टम (सोलारिस, उदाहरण के लिए) पर, killallकरता है वास्तव में यह क्या कहते हैं।
अगली सूचना तक रोक दिया गया।

4
यदि आप mosh पर जुड़े हुए हैं और आप चलाते हैं killall mosh-serverतो आपको काट दिया जाएगा।
0xcaff

1
@ 0xcaff यदि आप मोश से कनेक्ट हैं और kill `pidof mosh-server`आपको चलाते हैं तो आपको बस उसी तरह अलग कर दिया जाएगा
डेविड

26

अपने विस्मय के लिए, मैंने CRIU ( https://criu.org) का उपयोग किया ) का उपयोग चेकपॉइंट के लिए किया और एक mosh क्लाइंट को पुनरारंभ किया और यह काम किया।

चौंका देने वाला।

अपने mosh-client का PID ढूंढें:

$ ps -ef | ग्रेप मोश

फिर, उनके निर्देशों के अनुसार CRIU स्थापित करें।

फिर, इसे इस तरह जाँचें:

$ mkdir चौकी

$ sudo ./criu डंप -D चेकपॉइंट -t PID --shell-job

फिर, इसे पुनर्स्थापित करें:

$ sudo ./criu पुनर्स्थापना -D चेकपॉइंट -शेल-जॉब

और, वहाँ यह है। आपका mosh क्लाइंट वापस आ गया है।

एक बात पर ध्यान दें, हालांकि, यदि आपका लैपटॉप रिबूट करता है (जो कि हम जिस चीज से बचाव करने की कोशिश कर रहे हैं उसका पूरा बिंदु है), mosh एक का उपयोग करता है monotonic क्लाइंट साइड पर समय को ट्रैक करने के लिए घड़ी , जो रीबूट में काम नहीं करता है। यह काम नहीं करेगा, हालाँकि, यदि आपका लैपटॉप बस फ्लैट आउट क्रैश हो जाता है तो यह काम नहीं करेगा क्योंकि mosh अनुक्रम संख्या उस संस्करण के साथ सिंक से बाहर हो जाएगी जो चेकपॉइंट किया गया था (बाइनरी फिर से शुरू होगा, लेकिन संचार बंद हो जाएगा)।

इसे ठीक करने के लिए, आपको mosh को बताना बंद करना होगा और mosh स्रोत कोड डाउनलोड करना होगा। फिर, इस फ़ाइल को संपादित करें:

सीडी मॉश

vim config.ac

फिर, GETTIMEउस लाइन को खोजें और टिप्पणी करें।

फिर करो:

autoreconf # या ./autogen.sh यदि आपने पहली बार इसे क्लोन किया है

कॉन्फ़िगर

बनाना

स्थापित करें

उसके बाद, आपके CRIU-checkpointed mosh क्लाइंट सत्र रिबूट से बच जाएंगे।

(स्पष्ट रूप से आपको उपयोगी होने के लिए नियमित रूप से चौकियों को पूरा करने के लिए कुछ लिखने की आवश्यकता होगी। लेकिन, यह पाठक के लिए एक अभ्यास है)।


1
पुनर्स्थापना के बाद स्क्रीन का आउटपुट ताज़ा करने के लिए 'CTRL-L' टाइप करना सुनिश्चित करें।
माइकल गैलेक्सी

6
सरासर जिज्ञासा से, क्या मोश क्लाइंट सत्र को पुनर्स्थापित करने का व्यावहारिक लाभ है जो मुझे याद आ रहा है? मैं mosh पर tmux चलाता हूं और क्लाइंट पर केवल mosh को पुनः लोड कर सकता हूं और tmux को फिर से कनेक्ट कर सकता हूं ... क्या इसके कूल के अलावा ऐसा करने का कोई लाभ है (जो वास्तव में यह वास्तव में है!)।
15

1
लंबा उत्तर: github.com/mobile-shell/mosh/issues/394 संक्षिप्त उत्तर है, हाँ: यदि किसी व्यक्ति के पहले से ही लक्ष्य सर्वर पर चल रहा है तो tmux सत्र की आवश्यकता नहीं होनी चाहिए। यह न केवल चारों ओर झूठ बोलने वाले मॉम डेमोंस को छोड़ देता है, बल्कि इसके किस्ट्रोक्स का एक और सेट है जिसे हमें पहले स्थान पर टाइप नहीं करना चाहिए।
माइकल गैलेक्सी

1
एसएसएच के लिए मॉश एक विकल्प है (कुछ मामलों में), स्क्रीन के लिए नहीं। क्वथ कीथ (घोष लेखक)
जीथुब

19

मुझे एहसास है कि यह एक पुरानी पोस्ट है, लेकिन इसके लिए एक बहुत ही सरल उपाय है, जैसा कि कीथ विंस्टीन द्वारा सुझाया गया है, mosh लेखक, यहां: https://github.com/mobile-shell/mosh/issues/394

"ठीक है, पहले, यदि आप कई क्लाइंट्स (या क्लाइंट के मरने के बाद) से सेशन अटैच करने की क्षमता चाहते हैं, तो आपको स्क्रीन या tmux का उपयोग करना चाहिए। Mosh SSH के लिए एक विकल्प है (कुछ मामलों में), स्क्रीन के लिए नहीं। कई Mosh उपयोगकर्ता इसे स्क्रीन के साथ एक साथ उपयोग करते हैं और इसे इस तरह पसंद करते हैं। "

परिदृश्य: मैं mosh के माध्यम से एक दूरस्थ सर्वर में लॉग इन हूं। मैंने तब स्क्रीन को चलाया है और उदाहरण के लिए, स्क्रीन सत्र में एक प्रक्रिया चल रही है। मैं कनेक्शन खो देता हूं (लैपटॉप की बैटरी मर जाती है, नेटवर्क कनेक्शन खो देता है, आदि)। मैं mosh के माध्यम से फिर से कनेक्ट करता हूं और सर्वर पर वह संदेश प्राप्त करता हूं,

Mosh: आपके पास इस सर्वर पर एक अलग Mosh सत्र है (mosh [XXXX])।

मुझे सिर्फ इतना करना है कि पहले सेशन सेशन को मारना है

XXXX को मार डालो

और स्क्रीन सत्र के लिए रीटचैट, जो अभी भी मौजूद है

स्क्रीन -r

अब, htop (या जो भी प्रक्रिया चल रही थी) वापस आ गई है क्योंकि यह बिना किसी रुकावट के था। यह विशेष रूप से अपग्रेड या अन्य प्रक्रियाओं के लिए उपयोगी है जो अचानक गड़बड़ हो जाने पर सर्वर को एक गड़बड़, अज्ञात स्थिति में छोड़ देगा। मुझे लगता है कि आप tmux के साथ भी ऐसा कर सकते हैं, हालाँकि मैंने इसे आज़माया नहीं है। मेरा मानना ​​है कि यह वही है जो अनहिनाल्निक और एसखोल सुझाव दे रहे थे।


2
यह एक बेहतरीन जवाब है। धन्यवाद, और हाँ मैंने पुष्टि की कि यह tmux के साथ भी काम करता है।
हंसते

10

वर्ता के उत्तर के अतिरिक्त, मैं वर्तमान कमांड को छोड़कर सभी mosh कनेक्शन बंद करने के लिए निम्न कमांड का उपयोग करता हूं:

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 ने बताया, mosh के मालिक सुरक्षा कारणों से विभिन्न ग्राहकों से रिटेटिंग के खिलाफ हैं। इसलिए यदि आपका क्लाइंट चला गया है (जैसे आपने अपना लैपटॉप फिर से चालू किया है) तो आपका एकमात्र विकल्प सत्रों को मारना है।

केवल अलग किए गए सत्रों को मारने के लिए आप निम्नलिखित पंक्ति (जो मेरे पास एक उपनाम के रूप में है .bashrc) का उपयोग कर सकते हैं ।

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

यह आदेश इस तथ्य पर निर्भर करता है कि whomosh सत्रों से जुड़े उपयोगकर्ताओं को सूचीबद्ध करता है, केवल संलग्न mosh सत्रों में "mosh के माध्यम से" होता है, और mosh सत्रों में स्क्वायर ब्रैकेट में उनके pid होते हैं। तो यह बस अलग-अलग mosh सत्र के लिए pids पाता है और 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। आप इसे सर्वर साइड.bashrc पर अपने 300 जैसे कुछ पर सेट कर सकते हैं । फिर यदि आप ऐसा करते हैं तो यह केवल mosh- सर्वर को मार देगा जो पिछले 300 सेकंड में कनेक्ट नहीं हुए हैं (अन्य SIGUSER1 की उपेक्षा करेंगे)। मोश-सर्वर मैन पेज में अधिक जानकारी । मैं ऊपर दिए गए कमांड का उपयोग कर रहा हूं, क्योंकि एक बार अलियास होने के बाद, यह मुझे सरल लगता है।pkill -SIGUSER1 mosh-server

ध्यान दें, जैसा कि @Annihilannic द्वारा उल्लेख किया गया है, यदि आप अपने mosh सत्र के अंदर tmux / screen का उपयोग कर रहे हैं, तो mm सेशन को मारने के बाद वे tmux / स्क्रीन सत्र अभी भी आस-पास हैं। तो आप अभी भी उन्हें संलग्न कर सकते हैं (ताकि आप वास्तव में मॉश सत्रों को मारकर बहुत कुछ न खोएं)।


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 का उपयोग करें | ग्रेप मोश

इस आदेश का उपयोग करते हुए पॉश को मारें:

kill <pid>

इसके अलावा, सभी mosh कनेक्शन बंद करने के लिए:

ध्यान दें कि यदि आप वर्तमान में mosh के माध्यम से जुड़े हुए हैं, तो यह भी आपको डिस्कनेक्ट करता है

kill `pidof mosh-server`
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.