Ssh कमांड का उपयोग करके रिबूट निष्पादित करने के बाद कनेक्शन बंद करना


18

मैं reboot -fएक यूनिक्स मशीन को रिबूट करने के लिए दूरस्थ रूप से कमांड का उपयोग कर रहा हूं । समस्या यह है कि ssh कनेक्शन लंबे समय तक सक्रिय रहता है जो मुझे नहीं पता कि क्यों? मैं मशीन को रिबूट करने के तुरंत बाद ssh कनेक्शन को बंद करना चाहता हूं और अपने स्थानीय शेल पर वापस जाना चाहता हूं। मैं उसे कैसे कर सकता हूँ? ध्यान दें कि बिना -fध्वज के रिबूट कमांड काम नहीं करता है।


1
सिर्फ अपने रिमोट कनेक्शन (Ctrl + D) से बाहर क्यों न जाएं और शेल प्रॉम्प्ट को देखे बिना सर्वर को रिबूट होने दें?
gertvdijk

मैं इसे एक ही कमांड में कैसे कर सकता हूं?
coffeMug

2
मुझे इसका एक हल मिला जो दूसरों के लिए भी मददगार हो सकता है। मैंने ssh से जुड़ी कमांड शुरू करने के बाद कनेक्शन को बंद करने के लिए निम्नलिखित कमांड का उपयोग किया: ssh host "कमांड को होस्ट मशीन पर चलाने के लिए> / dev / null &" करीबी किया लेकिन कम से कम मेरे लिए यह मददगार था। अगर कोई भी कमांड के आउटपुट को / dev / null को निर्देशित करना समझता है और वह ssh कनेक्शन को क्यों मारता है तो अच्छा होगा यदि वह उसे समझा सके। :-)
coffeMug

ssh होस्ट "होस्ट मशीन पर चलने की आज्ञा> / dev / null &"
coffeMug

1
यह इस सवाल का जवाब नहीं है, लेकिन यह वैसे भी जानना उपयोगी है: SSH क्लाइंट के पास नियंत्रण पात्रों की एक श्रृंखला है जो क्लाइंट को मारने के लिए, अन्य चीजों के अलावा, का उपयोग किया जा सकता है। नियंत्रण वर्ण केवल एक नई रेखा के तुरंत बाद पहचाने जाते हैं, इसलिए दबाकर शुरू करें Enter। फिर ~.सत्र को समाप्त करने के लिए। Enter ~?दूसरों की सूची के लिए।
टॉम

जवाबों:


22

आदेश reboot -fकभी नहीं लौटता (जब तक कि आपके पास रिबूट का कारण बनने की अनुमति नहीं थी)। जिस बिंदु पर यह जारी किया गया है, SSH ग्राहक कुछ करने की प्रतीक्षा कर रहा है, जो हो सकता है:

  • एसएसएच सर्वर क्लाइंट को सूचित करता है कि ऐसा कुछ हुआ है जिसके लिए इसके ध्यान की आवश्यकता है, उदाहरण के लिए कि प्रदर्शन करने के लिए कुछ आउटपुट है, या दूरस्थ कमांड समाप्त हो गई है;
  • क्लाइंट साइड पर कुछ घटना, जैसे रिले के लिए एक संकेत;
  • एक टाइमर फायरिंग क्लाइंट को एक संदेश रखने के लिए भेजती है (और यदि सर्वर जवाब नहीं देता है तो कनेक्शन बंद कर दें)।

चूंकि SSH सर्वर प्रक्रिया मर चुकी है, SSH क्लाइंट तब तक नहीं मरेंगे जब तक टाइमर फायर नहीं करता।

यदि आप दौड़ते हैं ssh remotehost 'reboot -f >/dev/null &', तो क्या होता है:

  1. रिमोट शेल rebootपृष्ठभूमि में कमांड लॉन्च करता है ।
  2. क्योंकि सर्वर-साइड शेल कमांड से बाहर निकल गया है और मानक आउटपुट ओपन के लिए फ़ाइल डिस्क्रिप्टर रखने की कोई प्रक्रिया नहीं है, इसलिए एसएसएच सर्वर कनेक्शन बंद कर देता है।
  3. rebootआदेश रिबूट करने के लिए मशीन का कारण बनता है।

हालाँकि, यह विश्वसनीय नहीं है: समय के आधार पर, चरण 3 चरण 2 से पहले हो सकता है। एक टाइमर जोड़ने से यह संभावना नहीं है:

ssh remotehost '{ sleep 1; reboot -f; } >/dev/null &'

यह सुनिश्चित करने के लिए कि सर्वर पक्ष चलने के लिए प्रतिबद्ध है reboot, यह सुनिश्चित करते हुए कि यह वास्तव में क्लाइंट को सूचित करने से पहले रिबूट नहीं करता है कि यह प्रतिबद्ध है, आपको सर्वर से क्लाइंट तक जाने के लिए एक अतिरिक्त सूचना की आवश्यकता है। यह एसएसएच कनेक्शन के माध्यम से आउटपुट हो सकता है, लेकिन यह जटिल हो जाता है।


2
मामले में किसी को भी रिमोट होस्ट (समान समाधान) के भीतर से ऐसा करने के लिए एक रास्ता तलाश कर रहा है: (sleep 1 && sudo reboot &) && exit। कोष्ठक एक उपप्रकार को स्पॉन करता है, जो एक सेकंड का इंतजार करता है और फिर रिबूट शुरू करता है। हालाँकि मेजबान प्रक्रिया तुरंत ssh सत्र को समाप्त कर देती है। मैं एक शेल गुरु नहीं हूं, लेकिन यह मेरे लिए अब तक काम कर रहा है।
ग्रिद्दो

@ गरिदो ने शानदार काम किया और साफ सुथरा छोटा हैक है। मुझे यह पसंद है। साझा करने के लिए धन्यवाद!
यहोशू पिंटर

5

मुझे मेरे लिए सबसे अच्छा प्रदर्शन करने के लिए यह समाधान मिला।

-o "ServerAliveInterval 2"अपने sshआदेश के साथ प्रयोग करें , जैसे:

$ ssh -o "ServerAliveInterval 2" root@remotehost reboot

कहा गया विकल्प क्लाइंट पक्ष को हर 2 सेकंड में एक सुरक्षित चैनल पर सर्वर को प्रहार करता है। आखिरकार रिबूटिंग की कार्यवाही के रूप में, यह जवाब देना बंद कर देगा और ग्राहक कनेक्शन को फाड़ देगा।


धन्यवाद रोमन, जादू की तरह काम करता है! :)
stdcerr

4

कुछ उत्तर करीब थे, लेकिन सही उत्तर है:

ssh user@192.168.0.130 "nohup sudo reboot &>/dev/null & exit"

स्पष्टीकरण:

  • आप exitअंतिम कमांड के रूप में चाहते हैं, इसलिए अंतिम कमांड की स्थिति 0 (सफलता) है। आप चाहें तो नींद को रोक सकते हैं, लेकिन यह आवश्यक नहीं है
  • आपको पृष्ठभूमि में रिबूट चलाने की आवश्यकता है, क्योंकि अन्यथा सर्वर कनेक्शन बंद कर देगा और आपको एक त्रुटि मिलेगी। यह अभी भी अधिकांश सिस्टमों पर रीबूट होगा, लेकिन यदि आप स्क्रिप्टिंग कर रहे हैं तो रिटर्न स्टेटस त्रुटि होगी (0 नहीं) यहां तक ​​कि कमांड को ठीक से निष्पादित करने के साथ
  • पृष्ठभूमि पर चल रहा है के रूप में, पर्याप्त नहीं है stdinऔर stdoutअभी भी, SSH के माध्यम से आभासी टर्मिनल से जुड़े होते हैं तो कनेक्शन बंद कर दिया नहीं किया जाएगा। पृष्ठभूमि पर चल रही कमांड को समाप्त करने और छोड़ने के लिए आपको एसएसएच सत्र के लिए दो अतिरिक्त चीजें करने की आवश्यकता है।
    • 1) आप रीडायरेक्ट करना होगा stdoutऔर stderrकरने के लिए /dev/nullतो वे आभासी टर्मिनल कि SSH सत्र धारण द्वारा पुन: निर्देशित नहीं कर रहे हैं। यह &>/dev/nullहिस्सा है।
    • 2) आप stdinएक ही फैशन में एक अपठनीय फ़ाइल को रीडायरेक्ट करने की जरूरत है । शेल शेलिन यही nohupकरता है।

केवल टर्मिनल पर हर तरह से अलग की गई पृष्ठभूमि पर चलने वाली एक कमांड के साथ, exitसत्र बंद हो जाएगा और क्योंकि वर्चुअल टर्मिनल पर कोई भी चीज़ नहीं बची है stdinया नहीं stdoutरह गई है, SSH त्रुटियों के बिना कनेक्शन को समाप्त कर देगा।


1

मैं निम्नलिखित कमांड का उपयोग करता हूं:

ssh -t <hostname> 'sudo shutdown --reboot 0 && exit'

यहाँ यह क्या कर रहा है:

  • यह मशीन को अगले क्षण में रिबूट करने का निर्देश देता है, लेकिन इस कमांड के दौरान नहीं
  • SSH से सफाई से बाहर निकलता है
  • SSH TTY को पूरे समय बनाए रखता है ताकि सूडो खुश रहे और ठीक से क्रियान्वित हो सके।

0

क्या आपने निम्नलिखित कोशिश की है

# shutdown -r now

मुझे लगता है कि कुछ प्रणालियों पर मैंने पास में काम किया, रिबूट कमांड में कुछ समस्याएं थीं। तो फिर से मैं शटडाउन के मैनपेज में कुछ भी नहीं पा सकता हूं जो कि -f ध्वज के साथ रिबूट के समान होगा।


1
हां, शटडाउन मशीन में काम नहीं करता है जो मैं कुछ अजीब कारणों से कनेक्ट करने की कोशिश कर रहा हूं। यही कारण है कि मैं रिबूट -f का उपयोग एक शटडाउन और पुनरारंभ करने के लिए मजबूर करने के लिए करता हूं।
coffeMug

0

अगले आदेश का उपयोग करके ssh सत्र और रिबूट सिस्टम से बाहर निकलने के बारे में कैसे:

ssh login@host "reboot -f"

इसके बाद सिर्फ ssh को समाप्त करने के लिए Ctrl + C दबाएं।


0

मुझे इसका एक हल मिला जो दूसरों के लिए भी मददगार हो सकता है। मैंने ssh से जुड़ी कमांड शुरू करने के बाद कनेक्शन को बंद करने के लिए निम्न कमांड का उपयोग किया:

ssh host "command to run on the host machine > /dev/null &"

मुझे इस कारण के बारे में ठीक से समझ नहीं है कि यह कमांड कनेक्शन को बंद करने के लिए क्यों मजबूर करता है लेकिन कम से कम यह मेरे लिए मददगार था। अगर किसी को समझ में आता है कि वह ssh कनेक्शन को क्यों मारता है; कृपया समझाएँ।


0

इसके लिए 1 मिनट की देरी की आवश्यकता है, लेकिन मेरे लिए मज़बूती से काम किया है और SSH क्लाइंट हैंग की समस्या को हल करता है:

    $ sudo shutdown +1; logout

यह 1 मिनट के लिए सिस्टम शटडाउन को शेड्यूल करता है जो लॉगआउट के लिए समय की अनुमति देता है, और इसलिए SSH समाप्ति, पूरा करने के लिए। आप संभव के रूप में कम समय के रूप में प्रतीक्षा करने के लिए चाहते हैं, आप बदल सकते +1के साथ HH:MMदिन की एक तेजी से आ समय के लिए लेकिन यह है कि सही ढंग से समय मुश्किल हो सकता है और एक 59 सेकंड की देरी करने के लिए हो सकता है।


0

एक सरल तरीका जो मैंने पाया है, शटडाउन / रिबूट को एक बैकग्राउंड टास्क ('और' का उपयोग करके) के रूप में कमांड करना है, जब सत्र 'नोहप' के साथ बंद हो जाए, तो तत्काल शेल / सेशन एग्जिट के साथ बंद होने से बचाए:

nohup shutdown -r now & exit

इस तरह, एसएसएच क्लाइंट लटका नहीं है, क्योंकि सत्र तुरंत बाहर निकल जाता है, जबकि रिमोट सिस्टम इसके रिबूट के साथ तुल्यकालिक रूप से आगे बढ़ता है।


या फिर रिबूट के लिए अपने सिस्टम को "शटडाउन -आर अब" के बराबर स्थान दें ....
माइक डब्ल्यू

-2

इस आदेश का प्रयास करें:

$ reboot -f && exit

2
दुर्भाग्य से यह काम नहीं करता है।
coffeMug

1
@AK_Sw "काम नहीं करता है" के लिए विशिष्ट हो।
gertvdijk

@AK_Sw: अगर आपने '$' साइन टाइप किया है तो यह काम नहीं करेगा
tH0r

1
निकम्मा। यह बिल्कुल इसके बराबर है reboot -f
गाइल्स का SO- दुष्ट होना बंद करें '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.