नोह और एम्परसेंड में क्या अंतर है


242

दोनों nohup myprocess.out &या myprocess.out &पृष्ठभूमि में चलाने के लिए myprocess.out सेट करें। टर्मिनल बंद करने के बाद, प्रक्रिया अभी भी चल रही है। उनमें क्या अंतर है?


आप किस खोल का उपयोग कर रहे हैं? व्यवहार शेल में भिन्न होता है
shx2

1
दे घुमा के। और मुझे पता है कि अब @nemo के उत्तर के अनुसार क्यों।
यार्की

@ यार्की यदि उत्तर आपकी समस्या के अनुकूल है, तो कृपया प्रश्न को स्वीकार किए गए (उत्तर के वोटों के नीचे का चेकबॉक्स) के रूप में चिह्नित करें ताकि यह अनुत्तरित के रूप में चारों ओर झूलता न हो। आपको अपने सभी प्रश्नों के लिए ऐसा करना चाहिए :)
nemo

1
shutdownएक विशिष्ट लिनक्स अर्थ के साथ एक शब्द के रूप में बचा जाना चाहिए। और इसके द्वारा प्रतिस्थापित किया जाना चाहिए exit
पेट्रीज़ियो बर्टोनी

जवाबों:


316

nohupहैंगअप सिग्नल (देखें man 7 signal) को पकड़ता है जबकि एम्परसैंड नहीं करता है (शेल को छोड़कर उस तरह से कन्फ्यूज्ड है या बिल्कुल नहीं भेजता है SIGHUP)।

सामान्यतया, &शेल का उपयोग करने और बाहर निकलने के बाद कमांड चलाते समय , शेल हैंगअप सिग्नल ( kill -SIGHUP <pid>) के साथ उप-कमांड को समाप्त करेगा । इसका उपयोग करने से रोका जा सकता है nohup, क्योंकि यह सिग्नल को पकड़ता है और इसे अनदेखा करता है ताकि यह वास्तविक एप्लिकेशन तक कभी न पहुंचे।

यदि आप बैश का उपयोग कर रहे हैं, तो आप यह shopt | grep huponपता लगाने के लिए कमांड का उपयोग कर सकते हैं कि आपका शेल अपने बच्चे की प्रक्रियाओं के लिए SITEUP भेजता है या नहीं। यदि यह बंद है, तो प्रक्रियाओं को समाप्त नहीं किया जाएगा, क्योंकि यह आपके लिए मामला है। आवेदन कैसे समाप्त हो सकते हैं, इस बारे में अधिक जानकारी यहाँ मिल सकती है

ऐसे मामले हैं जो nohupकाम नहीं करते हैं, उदाहरण के लिए जब आप जिस प्रक्रिया को शुरू करते हैं वह SIGHUPसिग्नल को फिर से जोड़ता है , जैसा कि यहां मामला है


यह ध्यान देने योग्य हो सकता है कि बस &सबकुंड को कुछ सिग्नल प्राप्त नहीं करने का कारण बनता है (जैसे SIGINT)। nohupअनिवार्य रूप SIGHUPसे संकेतों की सूची में जोड़ा जाता है जो प्रचारित नहीं होते हैं।
स्टूजेक

46

myprocess.out &एक उपधारा का उपयोग करके पृष्ठभूमि में प्रक्रिया को चलाएगा। यदि वर्तमान शेल समाप्त हो जाता है (लॉगआउट द्वारा कहा जाता है), तो सभी उपधाराओं को भी समाप्त कर दिया जाता है, इसलिए पृष्ठभूमि प्रक्रिया भी समाप्त हो जाएगी। Nohup आदेश पर ध्यान नहीं देता HUPसंकेत है और इस तरह भले ही वर्तमान खोल समाप्त होता है, subshell और myprocess.outपृष्ठभूमि में चलाने के लिए जारी रहेगा। एक और अंतर यह है कि &अकेले stdout / stderr को पुनर्निर्देशित नहीं करता है, यदि कोई आउटपुट या त्रुटि है, तो वे टर्मिनल पर प्रदर्शित होते हैं। nohup दूसरी ओर stdout / stderr पर पुन: निर्देशित nohup.outया $HOME/nohup.out


6
मैं myprocess.out &खोल को चलाता और बाहर निकलता हूं । हालांकि, जब मैं ps aux | grep myprocess.outअन्य शेल में उपयोग करता हूं, तब भी मुझे "myprocess.out" मिल सकता है। इसका मतलब है कि प्रक्रिया अभी भी चल रही है, समाप्त नहीं की जा रही है।
यार्क

1
@amit_g जब माता-पिता के गोले को kill -9वहां से मारना होगा, तो वह SITEUP नहीं होगा क्योंकि इसके लिए मूल शैल को SIGKILL को संभालना होगा, जो वह नहीं कर सकता।
नेमो

2
दुकान की जाँच करें | grep hupon जैसा कि अन्य उत्तर में बताया गया है।
अमित_ग

31

अधिकांश समय हम ssh का उपयोग करके दूरस्थ सर्वर में प्रवेश करते हैं। यदि आप एक शेल स्क्रिप्ट शुरू करते हैं और आप लॉगआउट करते हैं तो प्रक्रिया मार दी जाती है। शेल से लॉग आउट करने के बाद भी Nohup स्क्रिप्ट को पृष्ठभूमि में जारी रखने में मदद करता है।

Nohup command name &
eg: nohup sh script.sh &

Nohup HUP संकेतों को पकड़ता है। Nohup पृष्ठभूमि में स्वचालित रूप से काम नहीं करता है। हमें स्पष्ट रूप से उपयोग करने और बताने की आवश्यकता है


धन्यवाद। आपके उत्तर की अपेक्षा नहीं थी लेकिन यह तथ्य कि यह यहाँ है महान है। यह उस प्रश्न का उत्तर देता है जो मैंने नहीं पूछा: D
वैभव कौशल

26

एम्परसेंड (&) का उपयोग करके एक चाइल्ड प्रोसेस (वर्तमान बैश सत्र के लिए बच्चा) में कमांड चलाएगा। हालांकि, जब आप सत्र से बाहर निकलते हैं, तो सभी बाल प्रक्रियाओं को मार दिया जाएगा।

nohup + ampersand (&) का उपयोग करना एक ही काम करेगा, सिवाय इसके कि जब सत्र समाप्त हो जाता है, तो बच्चे की प्रक्रिया के माता-पिता को "1" में बदल दिया जाएगा, जो कि "init" प्रक्रिया है, इस प्रकार बच्चे को मारे जाने से बचाती है।


7

यदि मैं गलत हूं तो मुझे सही करों

  nohup myprocess.out &

nohup hangup सिग्नल को पकड़ता है, जिसका अर्थ है कि टर्मिनल बंद होने पर यह एक प्रक्रिया भेजेगा।

 myprocess.out &

टर्मिनल बंद होने के बाद प्रक्रिया चल सकती है लेकिन रुकेगी।

nohup myprocess.out

प्रक्रिया बंद टर्मिनल को चलाने में सक्षम है, लेकिन आप टर्मिनल में ctrl+ दबाकर प्रक्रिया को रोकने में सक्षम हैं zCrt+ मौजूदा होने पर zकाम नहीं कर रहा &है।


2

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


0

ऐसे कई मामले हैं जब पर्यावरण के बीच छोटे अंतर आपको काट सकते हैं। यह वह है जिसमें मैंने हाल ही में भाग लिया है। इन दोनों आज्ञाओं में क्या अंतर है?

1 ~ $ nohup myprocess.out &
2 ~ $ myprocess.out &

उत्तर हमेशा की तरह ही है - यह निर्भर करता है।

nohup हैंगअप सिग्नल को पकड़ता है जबकि एम्परसेंड नहीं करता है।

हैंगअप सिग्नल क्या है?

SIGHUP - हैंगअप टर्मिनल को नियंत्रित करने या नियंत्रण प्रक्रिया की मृत्यु (मूल्य: 1) पर पाया गया।

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

ठीक है, लेकिन इस मामले में हमेशा 'buts' होते हैं। इन लॉन्चिंग विधियों के बीच कोई अंतर नहीं है जब शेल को इस तरह से कॉन्फ़िगर किया जाता है, जहां यह SIGHUP बिल्कुल भी नहीं भेजता है।

यदि आप बैश का उपयोग कर रहे हैं, तो आप यह निर्दिष्ट करने के लिए नीचे दिए गए आदेश का उपयोग कर सकते हैं कि क्या आपका शेल अपने बच्चे की प्रक्रियाओं के लिए SITEUP भेजता है या:

~ $ shopt | grep hupon

और इसके अलावा - ऐसे मामले हैं जहां नोहुप काम नहीं करता है। उदाहरण के लिए, जब आप प्रक्रिया शुरू करते हैं तो NOHUP सिग्नल को पुन: जोड़ देता है (यह अंदर किया जाता है, एप्लिकेशन कोड स्तर पर)।

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

एक लिनक्स वातावरण पर सब कुछ सुचारू रूप से काम करता है, एक दूसरे पर एक आवेदन छोड़ दिया जैसे ही दूसरा स्क्रिप्ट बाहर निकलता है (उस मामले का पता लगाते हुए, निश्चित रूप से मुझे और अधिक समय लगा तो आप सोच सकते हैं: अटक_आउट_टॉन्ग :)।

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

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