यदि खोल के बाहर निकलने, या मारे जाने पर पृष्ठभूमि वाली नौकरी मार दी जाती है, तो वास्तव में क्या निर्धारित करता है?


12

यह सवाल आ गया है काफी एक बहुत ( वास्तव में एक बहुत ), लेकिन मुझे जवाब आम तौर पर अधूरा लग रहा हूँ। सामान्य प्रश्न यह है कि "ssh बाहर निकलने / मारने पर मेरी नौकरी क्यों नहीं जाती / मारती है?", और यहाँ मैंने क्या पाया है। पहला सवाल है: निम्नलिखित जानकारी कितनी सामान्य है? निम्नलिखित आधुनिक डेबियन लिनक्स के लिए सही प्रतीत होता है, लेकिन मुझे कुछ बिट्स याद आ रहे हैं; और दूसरों को क्या पता होना चाहिए?

  1. Ssh कनेक्शन पर खोले गए शेल के सभी चाइल्ड प्रोसेस, बैकग्राउंड या नहीं, SIGHUP के साथ मारे जाते हैं, जब ssh कनेक्शन केवल तभी बंद huponexitहोता है जब विकल्प सेट होता है: shopt huponexitयह देखने के लिए रन करें कि क्या यह सच है।

  2. यदि huponexitयह सच है, तो आप शेल से प्रक्रिया का उपयोग कर सकते हैं nohupया disownइसे अलग कर सकते हैं ताकि बाहर निकलने पर यह मारा न जाए। या, चीजों को चलाएं screen

  3. यदि huponexitझूठा है, जो इन दिनों कम से कम कुछ linuxes पर डिफ़ॉल्ट है , तो सामान्य लॉगआउट पर पृष्ठभूमि वाली नौकरियों को नहीं मारा जाएगा।

  4. लेकिन यहां तक ​​कि अगर huponexitगलत है, तो अगर ssh कनेक्शन मारा जाता है , या ड्रॉप (सामान्य लॉगआउट से अलग), तो पृष्ठभूमि वाली प्रक्रियाएं अभी भी मार दी जाएंगी। इससे (2) में disownया इससे बचा जा सकता है nohup

  5. (ए) प्रक्रियाओं के बीच कुछ अंतर है, जिसकी मूल प्रक्रिया टर्मिनल है और (बी) प्रक्रियाएं जिनके पास स्टड, स्टडआउट या टर्मिनल से जुड़ा स्टडर है । मुझे नहीं पता कि जो प्रक्रियाएं होती हैं, वे (ए) और नहीं (बी), या इसके विपरीत हैं।

अंतिम प्रश्न: मैं व्यवहार (3) से कैसे बच सकता हूं? दूसरे शब्दों में, डेबियन पृष्ठभूमि में डिफ़ॉल्ट रूप से प्रक्रियाएं लॉगआउट के बाद स्वयं द्वारा पूरी तरह से चलती हैं, लेकिन ssh कनेक्शन के मारे जाने के बाद नहीं। मैं चाहे जो भी कनेक्शन सामान्य रूप से बंद कर दिया गया था या मार दिया गया था, उसी तरह की प्रक्रियाओं का भी होना चाहूंगा। या, यह एक बुरा विचार है?

संपादित करें: मारे जाने की नौकरियों को बनाए रखने के लिए एक और महत्वपूर्ण तरीका, वह काम करता है (?) या तो मामले में उन्हें स्क्रीन के माध्यम से चलाना है । लेकिन, सवाल यह समझने के बारे में है कि जब चीजें मार दी जाती हैं और जब वे नहीं होती हैं: कभी-कभी लोग चाहते हैं कि लोग लॉगआउट पर मारे जाएं, उदाहरण के लिए।

अधिक धागे: - संकेतों (sighup), नौकरियों और नियंत्रण टर्मिनल पर स्पष्टीकरण - /server/117152/do-background-processes-get-a-sighup-when-log-off - Continue SSH SSH को बंद करते समय बैकग्राउंड टास्क / जॉब - क्या SSH सेशन बंद होने के बाद बैकग्राउंड में जॉब चलती रहेगी? - SSH क्लाइंट को बंद करने के बाद पहले से चल रहे बैकग्राउंड प्रोसेस को रोकना - मैं SSH पर एक ऐसी प्रक्रिया कैसे शुरू कर सकता हूं कि यह डिस्कनेक्ट होने के बाद भी चलती रहेगी? - OS X पर रिमोट जॉब चालू रखने में असमर्थ - SSH कनेक्शन बंद करें

जवाबों:


1

एक प्रक्रिया "SIGHUP के साथ नहीं मार" है - कम से कम, शब्द के सख्त अर्थ में नहीं। बल्कि, जब कनेक्शन को गिरा दिया जाता है, तो टर्मिनल की नियंत्रण प्रक्रिया (इस मामले में, बैश) को एक हैंग-अप सिग्नल भेजा जाता है, जिसे आमतौर पर "HUP सिग्नल", या बस SIGHUP कहा जाता है।

अब, जब एक प्रक्रिया को एक संकेत प्राप्त होता है, तो वह इसे किसी भी तरह से संभाल सकता है **। अधिकांश संकेतों (HUP सहित) के लिए डिफ़ॉल्ट तुरंत बाहर निकलना है। हालाँकि, प्रोग्राम सिग्नल की अनदेखी करने या किसी प्रकार के सिग्नल हैंडलर फ़ंक्शन को चलाने के लिए स्वतंत्र है।

बैश आखिरी विकल्प चुनता है। इसका HUP सिग्नल हैंडलर यह देखने के लिए जांचता है कि क्या "huponexit" विकल्प सही है, और यदि ऐसा है, तो अपने प्रत्येक बच्चे की प्रक्रिया में SIGHUP भेजता है। केवल एक बार इसकी समाप्ति के साथ ही बैश से बाहर निकल जाता है।

इसी तरह, प्रत्येक बच्चे की प्रक्रिया यह करने के लिए स्वतंत्र है कि वह जो कुछ भी चाहता है जब वह सिग्नल प्राप्त करता है: इसे डिफ़ॉल्ट पर सेट करें (यानी तुरंत मर जाएं), इसे अनदेखा करें, या सिग्नल हैंडलर चलाएं।

Nohup केवल बच्चे की प्रक्रिया के लिए डिफ़ॉल्ट कार्रवाई को "अनदेखा" करने के लिए बदल देता है। एक बार बच्चे की प्रक्रिया चल रही है, हालांकि, यह सिग्नल के लिए अपनी प्रतिक्रिया को बदलने के लिए स्वतंत्र है।

यह, मुझे लगता है, यही कारण है कि कुछ कार्यक्रम मर जाते हैं भले ही आप उन्हें नोह के साथ भागते हैं:

  1. Nohup "अनदेखा" करने के लिए डिफ़ॉल्ट क्रिया सेट करता है।
  2. जब यह बाहर निकलता है, तो कार्यक्रम को किसी प्रकार की सफाई करने की आवश्यकता होती है, इसलिए यह "नज़रअंदाज़" झंडे को अधिलेखित करते हुए एक SITEUP हैंडलर स्थापित करता है।
  3. जब SIGHUP आता है, हैंडलर चलता है, प्रोग्राम की डेटा फ़ाइलों को साफ करता है (या जो कुछ भी करने की आवश्यकता होती है) और प्रोग्राम से बाहर निकलता है।
  4. उपयोगकर्ता हैंडलर या क्लीनअप के बारे में नहीं जानता या परवाह नहीं करता है, और बस देखता है कि कार्यक्रम nohup के बावजूद बाहर निकल गया।

यह वह जगह है जहां "विस्थापित" आता है। बाश द्वारा विघटित एक प्रक्रिया को कभी भी एचयूपी संकेत नहीं भेजा जाता है, भले ही हूपोनेक्सिट विकल्प हो। इसलिए भले ही प्रोग्राम अपना सिग्नल हैंडलर सेट करता है, लेकिन सिग्नल को वास्तव में कभी नहीं भेजा जाता है, इसलिए हैंडलर कभी नहीं चलता है। हालाँकि, ध्यान दें कि यदि प्रोग्राम लॉग आउट किए गए उपयोगकर्ता को कुछ पाठ प्रदर्शित करने की कोशिश करता है, तो यह I / O त्रुटि का कारण होगा, जो प्रोग्राम को वैसे भी बाहर निकलने का कारण बन सकता है।

* और, हाँ, इससे पहले कि आप पूछें, "हैंग-अप" शब्दावली UNIX के डायलअप मेनफ्रेम दिनों से बची हुई है।

** ज्यादातर संकेत, वैसे भी। उदाहरण के लिए, हमेशा कार्यक्रम को तुरंत, अवधि समाप्त करने का कारण बनता है।


2

अंक 1-4 सही हैं। मुझे इसके बारे में कुछ भी पता नहीं है। 5. आपके अंतिम बिंदु के अनुसार, एक बढ़िया एप्लीकेशन, स्क्रीन , आपको सभी प्रक्रियाओं को उनके स्वाभाविक अंत तक चलने देगा, चाहे आप अपना कनेक्शन कैसे भी समाप्त कर लें। स्क्रीन रिपोज में है।

स्क्रीन का आदमी वर्णन पढ़ना आसान नहीं है, लेकिन, अन्य बातों के अलावा, यह बताता है:

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

मैंने सबसे महत्वपूर्ण भाग को हाइलाइट किया है: आप विंडो को कमांड Ctrl + a + d के साथ अलग कर सकते हैं, और फिर आप अपने सत्र को मार सकते हैं / लॉगआउट कर सकते हैं, और अब-अलग की गई विंडो अभी भी चालू रहेगी, जिसमें प्रोग्राम अभी भी चल रहे हैं। जब आप वापस कनेक्ट करते हैं, उदाहरण के लिए, एक नया ssh सत्र शुरू करके , कमांड स्क्रीन -r स्क्रीन सत्र को फिर से शुरू करेगा जो पहले अलग किया गया था, जिसमें सभी आउटपुट मानक त्रुटि / आउटपुट स्पष्ट रूप से दिखाई देते हैं।

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