आइए पहले देखें कि क्या होता है यदि कोई प्रोग्राम एक इंटरैक्टिव शेल (एक टर्मिनल से जुड़ा हुआ) से शुरू किया जाता है, बिना &
(और बिना किसी पुनर्निर्देशन के)। तो चलिए मान लेते हैं कि आपने सिर्फ टाइप किया है foo
:
- चलने की प्रक्रिया
foo
बनाई गई है।
- इस प्रक्रिया में शेल से स्टड, स्टडआउट और स्टैडर प्राप्त होता है। इसलिए यह उसी टर्मिनल से भी जुड़ा हुआ है।
- यदि शेल प्राप्त करता है
SIGHUP
, तो यह SIGHUP
प्रक्रिया को भी भेजता है (जो सामान्य रूप से प्रक्रिया को समाप्त करने का कारण बनता है)।
- अन्यथा प्रक्रिया समाप्त होने तक शेल इंतजार करता है (अवरुद्ध है)।
अब, आइए देखें कि यदि आप प्रक्रिया को पृष्ठभूमि में रखते हैं, तो यह होता है foo &
:
- चलने की प्रक्रिया
foo
बनाई गई है।
- प्रक्रिया शेल से stdout / stderr विरासत में मिलती है (इसलिए यह अभी भी टर्मिनल को लिखता है)।
- सिद्धांत रूप में प्रक्रिया भी स्टैडेन को विरासत में मिलती है, लेकिन जैसे ही यह स्टड से पढ़ने की कोशिश करता है, इसे रोक दिया जाता है।
- इसे शेल नौकरियों के लिए पृष्ठभूमि की नौकरियों की सूची में रखा गया है, जिसका अर्थ है विशेष रूप से:
- इसके साथ सूचीबद्ध है
jobs
और इसका उपयोग करके पहुँचा जा सकता है %n
(जहां n
नौकरी संख्या है)।
- इसे एक अग्रभूमि नौकरी में बदल दिया जा सकता है
fg
, जिस स्थिति में यह जारी रहता है जैसे कि आपने उस पर उपयोग नहीं किया &
होगा (और यदि इसे मानक इनपुट से पढ़ने की कोशिश करने के कारण रोका गया था, तो यह अब टर्मिनल से पढ़ने के लिए आगे बढ़ सकता है)।
- यदि शेल प्राप्त हुआ
SIGHUP
, तो यह SIGHUP
प्रक्रिया को भी भेजता है । शेल के आधार पर और संभवतः शेल के लिए निर्धारित विकल्पों पर, शेल को समाप्त करते समय यह SIGHUP
प्रक्रिया को भी भेजेगा ।
अब disown
शेल की जॉब लिस्ट से जॉब को हटा दिया जाता है, इसलिए ऊपर दिए गए सभी सबप्वाइंट किसी भी अधिक लागू नहीं होते हैं ( SIGHUP
शेल द्वारा भेजे जा रहे प्रोसेस सहित )। हालांकि ध्यान दें कि यह अभी भी टर्मिनल से जुड़ा है, इसलिए यदि टर्मिनल नष्ट हो जाता है (अगर यह एक प्राइवेट था, के द्वारा बनाई गई उन जैसे जो भी हो सकता है xterm
या ssh
, और नियंत्रण कार्यक्रम समाप्त हो जाता है टर्म बंद करने या समाप्त करने से, SSH कनेक्शन) जैसे ही यह मानक इनपुट से पढ़ने या मानक आउटपुट पर लिखने का प्रयास करता है, प्रोग्राम विफल हो जाएगा।
nohup
दूसरी ओर, टर्मिनल से प्रक्रिया को प्रभावी ढंग से अलग करने के लिए क्या करता है:
- यह मानक इनपुट को बंद कर देता है (प्रोग्राम किसी भी इनपुट को पढ़ने में सक्षम नहीं होगा , भले ही यह अग्रभूमि में चलाया गया हो। यह रुका नहीं है, लेकिन एक त्रुटि कोड या प्राप्त करेगा
EOF
)।
- यह फ़ाइल में मानक आउटपुट और मानक त्रुटि को पुनर्निर्देशित करता है
nohup.out
, इसलिए टर्मिनल विफल होने पर मानक आउटपुट लिखने के लिए प्रोग्राम विफल नहीं होगा, इसलिए जो भी प्रक्रिया लिखता है वह खो नहीं जाता है।
- यह प्रक्रिया को एक
SIGHUP
(इस प्रकार नाम) प्राप्त करने से रोकता है ।
ध्यान दें कि nohup
है नहीं खोल की नौकरी नियंत्रण से प्रक्रिया को हटाने और भी पृष्ठभूमि में रख नहीं करता है (लेकिन जब से एक अग्रभूमि nohup
काम कम या ज्यादा बेकार है, तो आप आम तौर पर यह पृष्ठभूमि में का उपयोग कर रख दिया था &
)। उदाहरण के लिए, इसके विपरीत disown
, शेल तब भी आपको बताएगा कि जब नोक की नौकरी पूरी हो गई है (जब तक कि शेल को समाप्त नहीं किया जाता है, निश्चित रूप से)।
इसलिए संक्षेप में:
&
कार्य को पृष्ठभूमि में रखता है, अर्थात, यह इनपुट पढ़ने के प्रयास पर ब्लॉक करता है, और शेल को इसके पूरा होने की प्रतीक्षा नहीं करता है।
disown
शेल के नौकरी नियंत्रण से प्रक्रिया को हटा देता है, लेकिन यह अभी भी टर्मिनल से जुड़ा हुआ है। परिणामों में से एक यह है कि शेल इसे नहीं भेजेगा SIGHUP
। जाहिर है, इसे केवल बैकग्राउंड जॉब के लिए ही लागू किया जा सकता है, क्योंकि जब आप फोरग्राउंड जॉब चला रहे होते हैं तो आप इसे दर्ज नहीं कर सकते।
nohup
टर्मिनल से प्रक्रिया को डिस्कनेक्ट करता है, इसके आउटपुट को रीडायरेक्ट करता है nohup.out
और इसे से ढाल देता है SIGHUP
। प्रभावों में से एक (नामकरण एक) यह है कि इस प्रक्रिया को कोई भेजा नहीं जाएगा SIGHUP
। यह नौकरी नियंत्रण से पूरी तरह से स्वतंत्र है और सिद्धांत रूप में इसका उपयोग अग्रभूमि नौकरियों के लिए भी किया जा सकता है (हालांकि यह बहुत उपयोगी नहीं है)।