क्या `विघटित -एच` और` नोहुप` प्रभावी रूप से समान हैं?


18

disown

  • जब शेल समाप्त हो जाता है, और इसके बंद होने के कारण एक शेल को उसके काम में नहीं भेजने का कारण बनता है

  • शेल की नौकरी के नियंत्रण से विस्थापित नौकरी को हटा देता है।

क्या पहला परिणाम दूसरे का है? दूसरे शब्दों में, यदि शेल से शुरू की गई प्रक्रिया को शेल के जॉब कंट्रोल से किसी भी तरह से हटा दिया जाता है, तो क्या शेल समाप्त होने पर शेल प्रक्रिया में SITEUP नहीं भेजेगा?

disown -h अभी भी एक शेल के नौकरी नियंत्रण के तहत एक प्रक्रिया रहती है। क्या इसका मतलब यह है कि disown -hएक प्रक्रिया अभी भी शेल से भेजे गए SITEUP को प्राप्त करती है, लेकिन "नज़रअंदाज़" होने की प्रक्रिया द्वारा SITEUP की कार्रवाई सेट करती है? जैसा लगता है nohup

$ sleep 123 & disown -h
[1] 26103
$ jobs
[1]+  Running                 sleep 123 &
$ fg 1
sleep 123
$ ^Z
[1]+  Stopped                 sleep 125
$ bg 1
[1]+ sleep 123 &
$ exit

$ ps aux | grep sleep
t        26103  0.0  0.0  14584   824 ?        S    15:19   0:00 sleep 123

क्या disown -hऔर nohupकाम को प्रभावी ढंग से एक ही है, अगर हम एक टर्मिनल का उपयोग कर में अपने अंतर उपेक्षा?

धन्यवाद।


यहां चर्चा नहीं किए गए एक और अंतर यह है कि यदि आप उपयोग नहीं कर रहे हैं nohup, तो आपको TTY से दूर stdin / stdout / stderr को पुनर्निर्देशित करने की आवश्यकता है (अपने मूल शेल को एक से जुड़ा होना चाहिए)। (ओटीओएच, मैं वास्तव में एक अहंकारी हार्डकोड जैसे डिफ़ॉल्ट पर भरोसा करने से बेहतर अभ्यास पर विचार करता हूं ./nohup.out)।
चार्ल्स डफी

जवाबों:


21

nohupऔर वास्तव में एक ही चीज disown -hनहीं हैं

इसके साथ disown, मौजूदा इंटरैक्टिव शेल में नौकरियों की सूची से एक प्रक्रिया को हटा दिया जाता है। jobsबैकग्राउंड प्रोसेस शुरू करने और रनिंग के बाद रनिंग disownउस प्रक्रिया को शेल में नौकरी के रूप में नहीं दिखाएगी। HUPजब यह बाहर निकलता है (लेकिन अंत में नोट देखें) तो एक प्रसिद्ध नौकरी खोल से प्राप्त नहीं होगी ।

के साथ disown -h, नौकरी को नौकरी की सूची से नहीं हटाया जाता है, लेकिन HUPयदि यह बाहर निकलता है , तो शेल इसे संकेत नहीं भेजेगा (लेकिन अंत में नोट देखें)।

nohupउपयोगिता पर ध्यान नहीं देता HUPसंकेत दिया और उपयोगिता शुरू होता है। उपयोगिता सिग्नल मास्क को इनहेरिट करती है nohupऔर इसलिए HUPसिग्नल की अनदेखी भी करेगी । जब शेल समाप्त हो जाता है, तो यह प्रक्रिया एक बच्चे की प्रक्रिया के रूप में बनी रहती है nohup(और nohupफिर से पैरेंटेड होती है init)।

अंतर यह है कि संकेत भेजने वाले की परवाह किए बिना nohupउपेक्षा के साथ प्रक्रिया शुरू हुई HUP। अस्वीकृत प्रक्रियाओं बस नहीं कर रहे हैं भेजा एक HUPसंकेत खोल से , लेकिन अभी भी जैसे से संकेत भेजा जा सकता है kill -s HUP <pid>और इस पर ध्यान न दें नहीं होंगे।

ध्यान दें कि HUPकेवल एक शेल की नौकरियों के लिए भेजा जाता है अगर

  • शेल एक लॉगिन शेल है और huponexitशेल विकल्प सेट है, या
  • शेल अपने आप में एक HUPसंकेत देता है।

bashमैनुअल से प्रासंगिक बिट्स (मेरा जोर):

सिग्नल

[...]

एक के प्राप्त होने परSIGHUP शेल डिफ़ॉल्ट रूप से बाहर निकलता है । बाहर निकलने से पहले, एक इंटरेक्टिव शेल SIGHUPसभी नौकरियों के लिए, रनिंग या बंद हो जाता है। बंद नौकरियों SIGCONTको यह सुनिश्चित करने के लिए भेजा जाता है कि वे प्राप्त करें SIGHUP। शेल को किसी विशेष कार्य के लिए सिग्नल भेजने से रोकने के लिए, इसे जॉब टेबल से disownबिलिन ( SHELL BUILTIN COMMANDSनीचे देखें) के साथ हटा दिया जाना चाहिए या SIGHUP उपयोग न करने के लिए चिह्नित किया जाना चाहिए disown -h

यदि huponexitशेल विकल्प के साथ सेट किया गया है shopt, तो इंटरएक्टिव लॉगिन शेल से बाहर निकलने पर सभी नौकरियों को bashभेजता SIGHUPहै।

disown [-ar] [-h] [jobspec ... | pid ... ]

विकल्पों के बिना, jobspecसक्रिय नौकरियों की तालिका से प्रत्येक को हटा दें । [...] यदि -hविकल्प दिया जाता है, तो प्रत्येक jobspecको तालिका से हटाया नहीं जाता है , लेकिन इसे चिह्नित किया जाता है, ताकि SIGHUPशेल के प्राप्त होने पर नौकरी पर न भेजा जाएSIGHUP । [...]

सम्बंधित:


मैं bash: disown: nohup: no such jobऔर के लिए sleepऔर 5से मिलता है disown nohup sleep 5 &। अंतिम वाक्य से उस दूसरे आदेश का क्या मतलब है?
रुस्लान

@Ruslan हाँ मैं एक याद कर रहा हूँ &वहाँ में (और के आदेश nohupऔर disownभी गलत था)। धन्यवाद। अब अपडेट करेंगे।
Kusalananda

उदाहरण के लिए, unix.stackexchange.com/questions/484315/…
टिम

@ उत्तर के अत्यधिक संपादन के लिए क्षमा करें। मेरा सिर उसके चारों ओर होने में थोड़ा समय लगा। अब मैं काम कर रहा हूँ।
Kusalananda

धन्यवाद। disownशेल को नौकरी की सूची से बच्चे को हटाकर एक बच्चे को SITEUP नहीं भेजा जाता है। disown -hउसी को कैसे प्राप्त करता है ?
टिम

4

वे भिन्न हैं:

  • disown सक्रिय जॉब टेबल से कार्य को हटा देता है। फिर चालू नौकरी के साथ जारी है। -H के साथ प्रॉस्पेक्ट को SITEUP नहीं भेजा जाता है । इसके बजाय इसे खोल के साथ मरने के लिए छोड़ दिया जाता है, जिसमें इसे शामिल किया जाता है, जब यह एक SIGHUP की पुनरावृत्ति करता है।

  • nohup HUP को अनदेखा करता है। फिर जो कुछ भी बंद होने के बजाए टर्मिनल के पास गया होगा वह फाइल में जाता है nohup.out

    nohup को POSIX द्वारा परिभाषित किया गया है जबकि अव्यवस्थित नहीं है।


आपका क्या मतलब है, "उस शेल के साथ मरना जिसमें यह शामिल है"? माता-पिता की प्रक्रिया को मारना अपने आप में एक बच्चे को मारना नहीं है। ऐसे कार्यक्रम जिनके टर्मिनल बंद हैं, आमतौर पर टर्मिनल के PTY से जुड़ी फ़ाइल हैंडल के साथ बातचीत करने के प्रयासों से संबंधित विफलताओं के कारण मर जाते हैं, लेकिन यदि stdin / stdout / stderr को कहीं और पुनर्निर्देशित किया जाता है, तो ऐसा नहीं होगा।
चार्ल्स डफी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.