फिर से शुरू SSH सत्र में चल रहे कमांड को फिर से शुरू करें


32

इस सवाल को पढ़कर मुझे आश्चर्य हुआ। मानकर screenउपयोग नहीं किया जा रहा है। यदि लिनक्स लक्ष्य पर एक SSH सत्र, जो भी कारण से गिरा दिया जाता है, और आप समय से पहले सर्वर को सत्र को मारने से पहले फिर से कनेक्ट करते हैं, तो क्या रनिंग कमांड का नियंत्रण फिर से प्राप्त करना संभव है, क्योंकि टूटे सत्र के कारण इसे निरस्त नहीं किया जाएगा। ?


क्या आज्ञा है? मैं आम तौर पर अनुमान लगा रहा हूं कि उत्तर नहीं है।
davr

कोई विशेष आदेश नहीं, मैं सिर्फ एक सामान्य अवधारणा के रूप में पूछ रहा हूं।
जॉन गार्डनियर्स

1
एक व्यापक समझ के साथ कि कैसे tty सत्रों को आरम्भ किया जाता है, हमें यह बताने में सक्षम हो सकता है कि कैसे। लगता है कि यदि आप एक ही सत्र में एक नया सत्र फिर से बना सकते हैं और पिछले पीपीआईडी ​​को स्पष्ट रूप से असाइन कर सकते हैं तो यह संभव हो सकता है। मैं बस कुछ दाढ़ी वाले निक्स गुरु के साथ आने और हमारे दिमाग को उड़ाने का इंतजार कर रहा हूं। वह सपना है किसी भी तरह से।
कार्पेक्टम

यदि आप एक टेथर लैपटॉप के साथ प्रयोग करते हैं और ईथरनेट कॉर्ड को बाहर निकालते हैं तो क्या होगा?
पॉल

@ ~ drpaulbrewer - बिल्कुल वैसा ही जब आप एक डेस्कटॉप मशीन के साथ ऐसा करते हैं - कनेक्शन गिरा दिया जाता है। कनेक्शन कैसे छोड़ा जाता है यह सवाल के लिए अप्रासंगिक है।
जॉन गार्डनियर्स

जवाबों:


13

एक नए टर्मिनल के वर्तमान एसटीडी * फ़ाइल डिस्क्रिप्टर को एक पुरानी चल रही प्रक्रिया से जोड़ने का प्रयास सिर्फ परेशानी के लिए पूछ रहा है। यहां तक ​​कि अगर आप ऐसा करने का प्रबंधन करते हैं, तो टर्मिनल का काम नियंत्रण अपेक्षित रूप से काम नहीं करेगा। यदि आप अंततः ले-ओवर प्रोग्राम से बाहर निकलते हैं, तो आपके पीछे एक गड़बड़ होगी, और उस शेल का क्या होता है जिसने अपने फाइल डिस्क्रिप्टर को नए पृष्ठभूमि वाले प्रोसेस को सौंप दिया। उस खोल के चले जाने पर ssh खुला रहेगा? शायद ऩही। तो आपको पहले इसे कहीं और रीडायरेक्ट करना होगा।

संभव है या नहीं, मैं दांव लगाऊंगा कि यह त्यागने की प्रक्रिया को "स्वाभाविक रूप से" मारे जाने के लिए अधिक वांछनीय है। यदि आप नियंत्रण को फिर से शुरू करने के लिए आवश्यक सभी हैकरी को सही ठहराने के लिए पर्याप्त कुछ कर रहे हैं और आप एक अस्थिर लिंक पर हैं, तो आपको शायद यह पता होना चाहिए कि अग्रिम में और बस स्क्रीन का उपयोग करें (या vnc, या जो भी आपके अलग हो गए हैं- नियंत्रण नाव)। :)


मुझे स्वीकार करने के लिए एक उत्तर चुनना मुश्किल हो रहा है, इसलिए मैं इसे स्वीकार कर रहा हूं क्योंकि इस समय यह केवल एक ही है जिसका उत्थान है।
जॉन गार्डनियर्स

5

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मुझे लगा कि मेरे निष्कर्षों को जोड़ना महत्वपूर्ण है, जब मैं किसी और के साथ ऐसा करता हूं।

मैंने यह करने के लिए कोई असामान्य परिणाम नहीं देखा है, लेकिन यह वही है जो मैंने इस्तेमाल किया और इसने आश्चर्यजनक रूप से काम किया। कभी-कभी जब हम अपने सर्वर पर लंबी प्रक्रिया चलाते हैं तो यह कभी-कभार ssh सत्र को डिस्कनेक्ट कर देता है। टैटी सत्र के साथ प्रक्रिया चलती रहती है, लेकिन हम इसे पुनः कनेक्ट नहीं कर सकते हैं। मैंने नए कनेक्टेड सत्र में प्रक्रिया को खींचने के लिए नीचे दिए गए कार्यक्रम को पाया।

https://github.com/nelhage/reptyr

यहाँ अधिक जानकारी है

https://blog.nelhage.com/2011/02/changing-ctty/


5
सर्वर दोष में आपका स्वागत है! जब भी यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, तो उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर होगा
EEAA

धन्यवाद, @ user215086! हैरानी की बात है, यह काम किया! मैं थोड़ी देर के लिए एक लंबी कॉन्फिग फ़ाइल को एडिट कर रहा था, कस्टम सेटिंग्स का एक गुच्छा जोड़ा और ध्यान से लिखी गई टिप्पणियां, और जब कनेक्शन गिरा तो लगभग समाप्त हो गया था! "Noooooo !! ..." मैं छत पर अपवित्रता चिल्लाते हुए किया गया था, मैं reptyr, एट voila स्थापित! मैंने ssh सत्र को ठीक से पुनर्प्राप्त किया, जहां मैंने इसे अभी भी संपादक के अंदर छोड़ दिया, कुछ चीजें समाप्त कीं, सहेजा, किया !! वू हू! रेप्टियर कमाल का है।
कोल्डकोल्ड

4

आमतौर पर, इसे संभालने का सही तरीका समय से पहले इसकी तैयारी करना है, जीएनयू screenया बैश nohupया disownतंत्र का उपयोग करना। यदि आप उपयोग कर रहे हैं tcsh, तो शेल असामान्य रूप से बाहर निकलने पर पृष्ठभूमि की नौकरियों को भंग कर देगा।

यदि आप उपयोग नहीं कर रहे हैं, screenलेकिन अपनी प्रक्रिया को एक डिसऑन विधि के माध्यम से चालू रखने में कामयाब रहे हैं , तो आप gdb( स्रोत ) के साथ प्रक्रिया को फिर से जोड़ने में सक्षम हो सकते हैं :

[...] कुछ गंदे हैक्स के साथ, एक प्रक्रिया 'stdout / stderr / स्टड फिर से खोलना असंभव नहीं है। [...]

और फिर प्रक्रिया में संलग्न करने के लिए उदाहरण के लिए gdb का उपयोग करें, कुछ कॉल बंद करें (0)
कॉल क्लोज़ (1)
कॉल क्लोज़ (2)
कॉल ओपन ("/ dev / pts / xx", ...)
कॉल डूप (0)
कॉल डुप (0)
अलग

अब, आपको अपनी स्थिति के लिए इस प्रक्रिया को मोड़ना होगा। मुझे संदेह है कि यदि आप इस प्रक्रिया को भंग करने में कामयाब नहीं हुए हैं तो यह मदद करेगा । आप उपयोग कर रहे हैं bash, इस पोस्ट को देख बनाने के बारे में पार्टी स्वचालित रूप से अस्वीकार बाहर निकलने पर पृष्ठभूमि प्रक्रियाओं (मूल रूप से, बंद कर देते हैं huponexit साथ shopt )। अग्रभूमि प्रक्रिया के साथ, आपको नोह का उपयोग करने की आवश्यकता है ।


1

शायद ऩही। मैं यह गारंटी नहीं दे सकता कि यह असंभव है लेकिन मुझे वास्तव में संदेह है।

एक चीज शेल की हत्या की कमी है और संभव कनेक्शन ssh कनेक्शन की समाप्ति के परिणामस्वरूप चल रहा है। यह इतना मुश्किल नहीं है, आपको नोह और इसी तरह के तंत्र का उपयोग करने में सक्षम होना चाहिए जैसे कि दूसरे प्रश्न में उल्लेख किया गया है।

लेकिन फिर, मान लें कि आपने शुरू किया ssh somehost nuhup vim /some/fileऔर कनेक्शन मर जाता है। आप ssh somehostफिर से लॉग इन करने के लिए दौड़ते हैं और देख सकते हैं कि आपकी vim प्रक्रिया अभी भी चल रही है। लेकिन, आप फिर से उस प्रक्रिया से कैसे जुड़ेंगे? इंटरएक्टिव फोरग्राउंड प्रक्रियाओं में एक कंट्रोलिंग ट्टी होती है और जब आपकी प्रक्रिया शुरू होती है, तब से इसे बंद कर दिया जाता है। मुझे यकीन नहीं है कि आपके नए शेल में फिर से "रीओपनिंग" करने का कोई तरीका है (जैसे कि यदि आपके पास एक शेल में चलने वाले कई बैकग्राउंड जॉब्स हैं, तो आप किसी अन्य शेल में किसी को भी अग्रसर नहीं कर सकते हैं)।

Screenस्पष्ट रूप से इस कार्यक्षमता के लिए लिखा गया है। स्टार्टअप में यह दो प्रक्रियाओं, एक टर्मिनल प्रबंधन प्रक्रिया और एक ग्राहक प्रक्रिया की मांग करता है। इंटरैक्शन क्लाइंट <-> टर्मिनल मैनेजर <-> एप्लिकेशन है, और जब आप कनेक्ट करते हैं या कनेक्शन खो देते हैं तो क्लाइंट प्रक्रिया मर जाती है जबकि टर्मिनल मैनेजर जीवित रहता है। बाद में फिर से टर्मिनल प्रबंधन प्रक्रिया को संलग्न करने के लिए स्क्रीन के पास कुछ विशिष्ट समर्थन हैं, और मुझे नहीं लगता कि सामान्य मामले में यह संभव है।


धन्यवाद। यह बहुत ज्यादा है जो मुझे उम्मीद थी। आइए देखें कि क्या कोई हमें गलत साबित कर सकता है। ;)
जॉन गार्डनियर्स

मैं इस सवाल का जवाब एक कार्यक्रम है कि वहाँ लेखन के बाद से सीखा है reptyr "फिर से ptying" प्रक्रियाओं के लिए। इसलिए सिद्धांत रूप में, लेकिन मुझे अभी भी लगता है कि समग्र उत्तर शायद नहीं है।
होवडाल


1

यदि सत्र छोड़ दिया जाता है, तो इसका मतलब है कि टीटीएल पहले से ही समाप्त हो गया है, इसलिए आपके लिए कोई और अधिक मात्रा नहीं है (जैसा कि मैं इसे समझता हूं)। लेकिन, यदि आपका नेटवर्क कनेक्शन बाधित है, तो आपके SSH सत्र को नीचे जाने की आवश्यकता नहीं हो सकती है, और आपको अपना कनेक्शन फिर से शुरू करने और जारी रखने में सक्षम होना चाहिए। क्या आप इसके बारे में पूछ रहे हैं?


मैं सामान्य रूप से पूछ रहा था लेकिन मुझे सबसे ज्यादा दिलचस्पी तब है जब एक नेटवर्क समस्या एक कनेक्शन को छोड़ने का कारण बनती है। कुल मिलाकर, मैं कहूंगा कि यह बहुत अच्छा नहीं लग रहा है। फिर भी, यह केवल आवश्यकता के बजाय जिज्ञासा से बाहर पूछा गया था। इससे पहले कि आपको इसकी आवश्यकता हो, इसका उत्तर जानना हमेशा अच्छा होता है। ;)
जॉन गार्डनियर्स

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

0

इस प्रश्न में कुछ हैकिंग ट्टी चोरी कोड का लिंक था । आप सैद्धांतिक रूप से एक nohup प्रक्रिया के नियंत्रण को पुनः प्राप्त करने के लिए इसका उपयोग करने में सक्षम होना चाहिए।


1
उस प्रश्न के उत्तर में उल्लिखित डिस्साउन कमांड भी आगे की जांच के लायक है। धन्यवाद।
जॉन गार्डनियर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.