2013-03-24 7 views
156

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

+0

आप किस शैल का उपयोग कर रहे हैं? व्यवहार – shx2

+1

बाश के गोले में भिन्न होता है। और मुझे पता है कि अब @ एनमो के जवाब के अनुसार क्यों। – Yarkee

+0

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

उत्तर

215

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

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

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

मामलों में जहां nohup काम नहीं करता है, उदाहरण के लिए जब प्रक्रिया आप शुरू पुन: कनेक्ट हो SIGHUP संकेत, के रूप में यह मामला here है कर रहे हैं।

25

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

+2

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

+0

@amit_g 'kill -9' के साथ पैरेंट खोल को मारने पर एक SIGHUP नहीं होगा क्योंकि इसके लिए सिगकिल को संभालने के लिए पैरेंट खोल की आवश्यकता होगी, जो यह नहीं कर सकता है। – nemo

+2

दुकान की जांच करें जैसा कि दूसरे उत्तर में बताया गया है grep hupon। –

19

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

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

18

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

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

नोहुप एचयूपी संकेतों को पकड़ता है। नोहप पृष्ठभूमि में स्वचालित रूप से नौकरी नहीं डालता है। हमें यह बताने की ज़रूरत है कि

+0

धन्यवाद। आपके उत्तर की उम्मीद नहीं थी लेकिन तथ्य यह है कि यह यहां है। यह उस प्रश्न का उत्तर देता है जिसे मैंने नहीं पूछा था: डी –

1

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

2

मुझे सही अगर मैं कैच hangup संकेत है, जो मतलब है कि यह एक प्रक्रिया को भेजेगा टर्मिनल बंद कर दिया गलत हूँ

nohup myprocess.out & 

nohup।

myprocess.out & 

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

nohup myprocess.out 

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

संबंधित मुद्दे