आदेश reboot -f
कभी नहीं लौटता (जब तक कि आपके पास रिबूट का कारण बनने की अनुमति नहीं थी)। जिस बिंदु पर यह जारी किया गया है, SSH ग्राहक कुछ करने की प्रतीक्षा कर रहा है, जो हो सकता है:
- एसएसएच सर्वर क्लाइंट को सूचित करता है कि ऐसा कुछ हुआ है जिसके लिए इसके ध्यान की आवश्यकता है, उदाहरण के लिए कि प्रदर्शन करने के लिए कुछ आउटपुट है, या दूरस्थ कमांड समाप्त हो गई है;
- क्लाइंट साइड पर कुछ घटना, जैसे रिले के लिए एक संकेत;
- एक टाइमर फायरिंग क्लाइंट को एक संदेश रखने के लिए भेजती है (और यदि सर्वर जवाब नहीं देता है तो कनेक्शन बंद कर दें)।
चूंकि SSH सर्वर प्रक्रिया मर चुकी है, SSH क्लाइंट तब तक नहीं मरेंगे जब तक टाइमर फायर नहीं करता।
यदि आप दौड़ते हैं ssh remotehost 'reboot -f >/dev/null &'
, तो क्या होता है:
- रिमोट शेल
reboot
पृष्ठभूमि में कमांड लॉन्च करता है ।
- क्योंकि सर्वर-साइड शेल कमांड से बाहर निकल गया है और मानक आउटपुट ओपन के लिए फ़ाइल डिस्क्रिप्टर रखने की कोई प्रक्रिया नहीं है, इसलिए एसएसएच सर्वर कनेक्शन बंद कर देता है।
reboot
आदेश रिबूट करने के लिए मशीन का कारण बनता है।
हालाँकि, यह विश्वसनीय नहीं है: समय के आधार पर, चरण 3 चरण 2 से पहले हो सकता है। एक टाइमर जोड़ने से यह संभावना नहीं है:
ssh remotehost '{ sleep 1; reboot -f; } >/dev/null &'
यह सुनिश्चित करने के लिए कि सर्वर पक्ष चलने के लिए प्रतिबद्ध है reboot
, यह सुनिश्चित करते हुए कि यह वास्तव में क्लाइंट को सूचित करने से पहले रिबूट नहीं करता है कि यह प्रतिबद्ध है, आपको सर्वर से क्लाइंट तक जाने के लिए एक अतिरिक्त सूचना की आवश्यकता है। यह एसएसएच कनेक्शन के माध्यम से आउटपुट हो सकता है, लेकिन यह जटिल हो जाता है।