क्या SSH सत्र से डिस्कनेक्ट होना आपके कार्यक्रमों को मार देता है?


88

तो, मैं एक SSH सत्र से डिस्कनेक्ट पाने के बाद मैं शुरू कर दिया है का कहना है कि rsyncया cpया किसी अन्य आदेश है कि लंबे समय से चल रहा है हो सकता है। क्या यह आदेश तब तक चलता रहता है जब तक कि मैं डिस्कनेक्ट होने के बाद समाप्त नहीं हो जाता या इसे सिर्फ मार दिया जाता है?

हमेशा यही सोचता रहा।


मैं बस ऊपर जो कहा गया है उसे जोड़ना चाहता हूं, यदि आप अपने आप को ऐसी स्थिति में पाते हैं जब आपको पहले से चल रही प्रक्रिया को लागू करने की आवश्यकता होती है screen, तो पुनरावृत्ति का प्रयास करें
एक उदास दोस्त

यह आपके कार्यक्रमों को मार देगा। अगर आप उबंटू 16.04 से 17.10 तक SSH के माध्यम से OS संस्करण अपडेट कर रहे हैं तो बहुत कष्टप्रद है
kurdtpage

जवाबों:


118

2016 के लिए संपादित करें:

यह Q & A systemd v230 पराजय से पहले का है । Systemd v230 के अनुसार, नया डिफ़ॉल्ट एक समाप्ति सत्र के सभी बच्चों को मारने के लिए है, इस बात की परवाह किए बिना कि ऐतिहासिक रूप से वैध सावधानी बरती गई थी। उपयोगकर्ता -केंद्र में डेमॉन शुरू करने के लिए सिस्टम-विशिष्ट तंत्र का उपयोग करके, या सेटिंग KillUserProcesses=noको बदलकर व्यवहार को बदला जा सकता है /etc/systemd/logind.conf। वे तंत्र इस प्रश्न के दायरे से बाहर हैं।

नीचे दिया गया पाठ बताता है कि लिनक्स की तुलना में अधिक समय तक यूनिक्स डिजाइन क्षेत्र में पारंपरिक रूप से किस तरह काम किया जाता है।


वे मारे जाएंगे, लेकिन जरूरी नहीं कि तुरंत। यह इस बात पर निर्भर करता है कि एसएसएच डेमन को यह तय करने में कितना समय लगता है कि आपका कनेक्शन मृत है। निम्नलिखित एक लंबी व्याख्या है जो आपको यह समझने में मदद करेगी कि यह वास्तव में कैसे काम करता है।

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

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

नियंत्रण टर्मिनल के हैंगअप से बचने वाली प्रक्रियाएं ऐसी होती हैं जो या तो स्वयं को टर्मिनल होने से रोकती हैं (डेमन प्रक्रियाएं जो आपने इसके अंदर शुरू की थीं), या वे जो एक उपसर्ग nohupकमांड के साथ लागू किए गए थे । (यानी "इस पर लटका नहीं") डेमॉन HUP सिग्नल की अलग तरह से व्याख्या करते हैं; चूंकि उनके पास एक नियंत्रित टर्मिनल नहीं है और स्वचालित रूप से एक एचयूपी सिग्नल प्राप्त नहीं करता है, इसलिए इसे कॉन्फ़िगरेशन को फिर से लोड करने के लिए व्यवस्थापक से मैन्युअल अनुरोध के रूप में पुनर्प्राप्त किया जाता है। विडंबना यह है कि अधिकांश प्रवेशकों ने गैर-डेमॉन के लिए इस सिग्नल के "हैंगअप" उपयोग को बहुत बाद तक नहीं सीखा है। इसलिए आप इसे पढ़ रहे हैं!

टर्मिनल मल्टीप्लेक्सर्स आपके शेल वातावरण को डिस्कनेक्ट के बीच बरकरार रखने का एक सामान्य तरीका है। वे आपको अपनी शेल प्रक्रियाओं से इस तरह से अलग करने की अनुमति देते हैं कि आप बाद में उन्हें फिर से धोखा दे सकते हैं, भले ही वह वियोग आकस्मिक या जानबूझकर हो। tmuxऔर screenअधिक लोकप्रिय हैं; उनका उपयोग करने के लिए वाक्यविन्यास आपके प्रश्न के दायरे से बाहर है, लेकिन वे देखने लायक हैं।


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

इस विशेष संदर्भ में, कारकों में सबसे अधिक संभावना है कि वे ट्रिगर करें:

  • एक प्रक्रिया (आमतौर पर अग्रभूमि में एक) सर्वर पक्ष पर PTY को लिखने का प्रयास करती है। (सर्वर> ग्राहक)
  • उपयोगकर्ता क्लाइंट पक्ष पर PTY को लिखने का प्रयास कर रहा है। (ग्राहक> सर्वर)
  • किसी भी प्रकार के रखवाले। ये आमतौर पर क्लाइंट या सर्वर द्वारा डिफ़ॉल्ट रूप से सक्षम नहीं होते हैं, और आमतौर पर दो फ्लेवर होते हैं: एप्लिकेशन स्तर और टीसीपी आधारित (यानी SO_KEEPALIVE)। रखवाले राशि या तो सर्वर या ग्राहक को दूसरी ओर पैकेट भेजते हैं, तब भी जब सॉकेट को लिखने का कोई कारण नहीं होगा। हालांकि यह आमतौर पर उस फायरवॉल्स को स्कर्ट करने का इरादा है, जो समय-समय पर कनेक्शन को जल्दी से समाप्त करता है, इसमें प्रेषक को नोटिस करने का कारण साइड इफेक्ट होता है जब दूसरा पक्ष अधिक तेज़ी से प्रतिक्रिया नहीं दे रहा है।

टीसीपी सत्र के लिए सामान्य नियम यहां लागू होते हैं: यदि क्लाइंट और सर्वर के बीच कनेक्टिविटी में रुकावट है, लेकिन समस्या के दौरान एक पैकेट भेजने के लिए न तो कोई प्रयास करता है, तो कनेक्शन बचेगा कि दोनों पक्ष बाद में उत्तरदायी हैं और अपेक्षित टीसीपी प्राप्त कर रहे हैं। अनुक्रम संख्या।

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


3
मैं उस सूची में 'dtach' कमांड भी जोड़ूंगा - यह स्क्रीन / tmux के विपरीत की तरह है जिसमें यह आपको एक सत्र में कई टर्मिनलों को जोड़ने की सुविधा देता है, और एक सत्र को लम्बा करने के लिए भी बहुत अच्छा है, हालांकि यह नहीं करता है हाल के इतिहास को फिर से लिखने का कोई साधन प्रदान करें।
शराबी

dtachurl यहाँ है: dtach.sourceforge.net
slm

2
उत्कृष्ट व्याख्या। मैं पहले से ही अधिक linuxey लगता है!
०१३

3
इसके अलावा, जबकि यह तकनीकी रूप से आपके उत्तर का हिस्सा नहीं है, यहाँ एक मामूली सा अनुभव है: आप kill -HUPकिसी के टर्मिनल को लटकने के लिए मजबूर करने के लिए मूल के रूप में उपयोग कर सकते हैं । आपको अच्छे कारण के बिना ऐसा नहीं करना चाहिए। मुझे अपना अधिकांश माइलेज तब मिलता है जब उपयोगकर्ता रखरखाव के दौरान चलने वाले गोले छोड़ते हैं और मुझे एक फाइल सिस्टम को खोलना होगा जो उनका खोल खुला रख रहा है। यदि उपयोगकर्ता जुड़ा हुआ है, लेकिन निष्क्रिय है, तो उनकी sshd प्रक्रिया को संकेत भेजें। अन्यथा, यदि यह टर्मिनल मल्टीप्लेक्सर के अंदर चल रहा है, तो इसे उस शेल पर भेजें जिसे आप रोकना चाहते हैं। केवल आपको काम करने से बचाने के लिए खोल को लटका दें!
एंड्रयू बी

@AndrewB, क्या आप विस्तार से बता सकते हैं कि "SSH डेमॉन प्रक्रिया ... कैसे तय करती है कि आपका कनेक्शन मृत है"? और मुझे कैसे पता चलेगा कि SSH डेमन सोचता है / जानता है कि (जो) कनेक्शन मृत है या नहीं?
जिओ पेंग - ZenUML.com

22

जैसा कि अन्य ने उल्लेख किया है, एक बार जब आप ssh से डिस्कनेक्ट करते हैं, तो उसके भीतर चल रहा कुछ भी नहीं चला जाता है।

जैसा कि @Michael Hampton और अन्य ने उल्लेख किया है कि आप अपनी सामग्री (अर्थात बाल प्रक्रिया) को खोए बिना टर्मिनलों जैसे टूल का उपयोग tmuxया screenडिस्कनेक्ट / फिर से कनेक्ट कर सकते हैं ।

इसके अतिरिक्त आप एक प्रक्रिया को एक एम्परसेंड का उपयोग करके पृष्ठभूमि में रख सकते हैं &और फिर disownवर्तमान शेल के साथ उन्हें अलग करने के लिए कमांड का उपयोग कर सकते हैं।

# start a command
% sleep 5000 &
[1] 3820

# check it
% jobs
[1]+  Running                 sleep 5000 &

# disown everything
% disown -a

# check it again (gone from shell)
% jobs
%

# but it's still running on the system
% ps -eaf|grep "[s]leep"
saml      3820 23791  0 00:16 pts/1    00:00:00 sleep 5000
%

क्या किसी टर्मिनल disownप्रक्रिया को एक एड प्रक्रिया में बदलना संभव है ?
नकली नाम

4
हाँ। विवरण के लिए यह U & L प्रश्न देखें: unix.stackexchange.com/questions/4034/…
slm

13

नहीं, कोई भी कार्यक्रम अभी भी टर्मिनल से जुड़ा हुआ है, और पृष्ठभूमि में नहीं रखा गया है nohup, जैसे कुछ भी हो, उसे मार दिया जाएगा।

यही कारण है कि वर्चुअल टर्मिनल सॉल्यूशन जैसे tmuxऔर पुराने हैं screenजो सत्र बनाते हैं जो कि डिस्कनेक्ट होने पर भी चलते रहते हैं, और जिनसे आप बाद में रिजेक्ट कर सकते हैं।

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