नोह, डिसाइड और & के बीच अंतर


579

आपस में क्या अंतर हैं

$ nohup foo

तथा

$ foo &

तथा

$ foo & 
$ disown

50
रुको, आप एक पीआईडी ​​निर्दिष्ट किए बिना विघटित कर सकते हैं? महान!
ripper234

34
वहाँ भी है foo &!जो शुरू से ही इसे ठीक करने के बराबर होना चाहिए।
user4514

26
बैश का समर्थन नहीं करता है!
जोनास कोंग्लसंड

20
foo & disownतुरंत भंग करने के लिए।
ctrl-alt-delor-

9
मैं इसका उल्लेख देखना पसंद करूंगा setsid, और यह कैसे संबंधित होगा disownऔरnohup
यंगफ्रॉग

जवाबों:


558

आइए पहले देखें कि क्या होता है यदि कोई प्रोग्राम एक इंटरैक्टिव शेल (एक टर्मिनल से जुड़ा हुआ) से शुरू किया जाता है, बिना &(और बिना किसी पुनर्निर्देशन के)। तो चलिए मान लेते हैं कि आपने सिर्फ टाइप किया है 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। यह नौकरी नियंत्रण से पूरी तरह से स्वतंत्र है और सिद्धांत रूप में इसका उपयोग अग्रभूमि नौकरियों के लिए भी किया जा सकता है (हालांकि यह बहुत उपयोगी नहीं है)।

8
+1 धन्यवाद। तब क्या होता है जब disown, nohup और & एक साथ उपयोग किया जाता है?
टिम

15
यदि आप तीनों का एक साथ उपयोग करते हैं, तो प्रक्रिया पृष्ठभूमि में चल रही है, शेल के नौकरी नियंत्रण से हटा दी जाती है और टर्मिनल से प्रभावी रूप से डिस्कनेक्ट हो जाती है।
celtschk


1
क्या बीच का अंतर है disown %1और disown -h %1? टर्मिनल से बाहर निकलने तक दूसरा व्यक्ति एक नियमित नौकरी के रूप में रखेगा (लेकिन एचयूपी सिग्नल की उपेक्षा करता है)?
स्कीमैक्स

4
हो सकता है कि सहित लायक (foo&)subshell
jiggunjer

169

&प्रोग्राम को पृष्ठभूमि में चलाने का कारण बनता है, इसलिए आपको प्रोग्राम समाप्त होने तक ब्लॉक करने के बजाय एक नया शेल प्रॉम्प्ट मिलेगा। nohupऔर disownकाफी हद तक असंबंधित हैं; वे SIGHUP (हैंगअप) संकेतों को दबाते हैं, ताकि नियंत्रण टर्मिनल बंद होने पर कार्यक्रम स्वचालित रूप से मारा न जाए। nohupयह तब होता है जब नौकरी पहली बार शुरू होती है। यदि आप nohupशुरू होने पर नौकरी नहीं करते हैं , तो आप disownएक चल रही नौकरी को संशोधित करने के लिए उपयोग कर सकते हैं ; किसी भी तर्क के साथ यह वर्तमान नौकरी को संशोधित नहीं करता है, जो कि अभी पृष्ठभूमि में था


10
Nohup और disown के बीच मामूली अंतर: disown कमांड इसे आपकी नौकरियों की सूची से हटा देगा; nohup नहीं होगा
शॉन जे। गोफ

191
nohupऔर disownदोनों को दबाने के लिए कहा जा सकता है SIGHUP, लेकिन अलग-अलग तरीकों से। nohupप्रोग्राम को शुरू में संकेत को अनदेखा करता है (प्रोग्राम इसे बदल सकता है)। nohupप्रोग्राम को नियंत्रित करने वाला टर्मिनल न होने की व्यवस्था करने का भी प्रयास करता है, ताकि SIGHUPटर्मिनल बंद होने पर इसे कर्नेल द्वारा नहीं भेजा जाएगा । disownपूरी तरह से खोल के लिए आंतरिक है; SIGHUPजब यह समाप्त हो जाता है तो यह शेल को नहीं भेजने का कारण बनता है ।
गिल्स

27
@Gilles, आपकी टिप्पणी स्वयं के जवाब के लायक है।
18

5
disownनौकरी सूची से नौकरी हटाने से संबंधित @ ShawnJ.Goff की टिप्पणी पर सिर्फ एक स्पष्टीकरण । यदि आप एक विकल्प निर्दिष्ट नहीं करते हैं, तो यह नौकरियों की सूची से हटा देता है। हालाँकि , यदि आप -hविकल्प निर्दिष्ट करते हैं , तो प्रत्येक जॉबस्पेक को तालिका से हटाया नहीं जाता है। इसके बजाय, यह बनाता है ताकि SIGHUPशेल को प्राप्त होने पर नौकरी पर न भेजा जाए SIGHUP
6

4
बस स्पष्ट करने के लिए उपयोग करते हुए, &, आप एक टर्मिनल नहीं देता है यह अलग हो जाता है stdinइस प्रक्रिया से और पृष्ठभूमि में चलाने के लिए यह कारण बनता है, लेकिन दोनों stdoutऔर stderrअभी भी चालू tty से जुड़ा हुआ है। इसका मतलब है कि आपको अलग-अलग कार्यक्रमों से एक साथ मिलाया जा सकता है, जो कि अगर आप करते हैं gimp &और किसी और चीज़ के लिए उस tty का उपयोग करने की कोशिश करते समय बहुत सारे GTK + त्रुटियाँ प्राप्त कर सकते हैं, तो यह काफी कष्टप्रद हो सकता है।
फ्रैंक

8

यहां मेरा अनुभव पृष्ठभूमि में एक गैर-समाप्ति आदेश (जैसे tail) के बाद, सॉफिस चलाने की कोशिश कर रहा है । इस उदाहरण के लिए मैं उपयोग करूंगा sleep 100

और

#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

मैं सॉफिस लॉग देखता हूं / दबाकर - सॉफिस बंद हो जाता हैCtrlC

nohup .. और

#!/bin/bash
nohup /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

मैं सॉफिस लॉग नहीं देखता / दबाकर - सॉफिस बंद हो जाता हैCtrlC

और भंग कर दिया

#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard & disown
sleep 100

मैं सॉफिस लॉग देखता हूं / दबाकर - सॉफिस बंद हो जाता हैCtrlC

सेटिस् .. और

#!/bin/bash
setsid /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

मैं सॉफिस लॉग देखता हूं / दबाकर - सॉफिस नॉट स्टॉपCtrlC

स्थान बचाने के लिए:
nohup setsid ..: लॉग प्रदर्शित नहीं करता है / soffice पर नहीं रुकती Ctrl-C
nohup साथ & disownअंत में: लॉग प्रदर्शित नहीं करता है / soffice पर बंद हो जाता है Ctrl-C


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

1
@YoungFrog मैं इस पर सहमत हूँ!
मैरिनोस अन

मेरे लिए, nohup ⟨command⟩ & disownबनाई गई प्रक्रिया पर रोक नहीं है Ctrl+C
k.stm

@ k.stm क्या आपने कोशिश की soffice? sofficeलगता है कि कमांड कुछ अलग है। इसलिए मैंने इसे एक नियम अपवाद के रूप में जोड़ा। जैसे उपयोग करते समय: सामान्य रूप से nohup .. &दबाने Ctrl-cसे कमांड बंद नहीं होता है, लेकिन इसके साथ sofficeहोता है। मैं तब तक प्रतीक्षा करता हूं जब तक कोई इस पर कदम नहीं उठाता और समझाता है कि ऐसा सॉफिस के साथ क्यों होता है :)
मैरिनो एन

@MarinosAn हाँ, मैंने किया। मैंने दौड़ कर nohup soffice &दबाया Ctrl+C। उम्मीद के मुताबिक कुछ नहीं हुआ।
k.stm
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.