शेल से बाहर निकलने पर मैं कैसे एक प्रक्रिया को कांटा करता हूं जो मरती नहीं है?


31

यदि मैं शेल से emacs चलाता हूं:

$ emacs foo &

और फिर उस गोले को मारें, जिससे एमएसीएस मर जाए।

मैं एक कमांड कैसे चला सकता हूं ताकि शेल के मरने पर यह मर न जाए?

मुझे नोह का संदर्भ मिला, लेकिन यह मदद करने के लिए नहीं लगता है:

$ nohup emacs foo &

अभी भी emacs को मारता है जब शेल मर जाता है।

जवाबों:


13

आप यह उल्लेख नहीं करते हैं कि क्या यह एक्स ऐप या कंसोल ऐप के रूप में चल रहा है।

यदि यह एक कंसोल ऐप के रूप में है, तो निश्चित रूप से इसे बंद करने की आवश्यकता है। आपने इसे इनपुट / आउटपुट से छुटकारा दिलाया, अधिक तकनीकी रूप से (छद्म) ट्टी पर था। यह बहुत संभावना नहीं है कि आपका क्या मतलब है, तो चलो मान लेते हैं कि आप एक एक्स ऐप के बारे में बात कर रहे हैं।

nohupकाम करना चाहिए, यह सुनिश्चित नहीं है कि यह क्यों नहीं है। जब शेल बंद हो जाता है, तो यह SIGHUPअपने प्रक्रिया समूह में सभी प्रक्रियाओं को भेजता है। nohup कमांड को SIGHUP को अनदेखा करने के लिए कहता है।

आप सेटसाइड भी आज़मा सकते हैं, जो प्रक्रिया समूह से प्रक्रिया को डिस्कनेक्ट करता है

alias emacs='setsid emacs'

या disownबाद में जोड़ें&


आह, बहुत अच्छा काम करता है। स्पष्ट नहीं होने के बारे में क्षमा करें। हां, मैं उन एक्स ऐप्स की बात कर रहा हूं जो वास्तव में शेल में नहीं चलते हैं। असल में, मैं खोल से emacs (या किसी अन्य प्रक्रिया) को शुरू करना चाहता हूं, लेकिन मैं इसे किसी भी तरह से खोल से बंधा नहीं चाहता। मैं इसे वहां सुविधा के लिए शुरू कर रहा हूं।
sligocki

41

सबसे विश्वसनीय तरीका प्रतीत होता है:

(setsid emacs &)

यह ( &)बैकग्राउंड में फोर्क और setsidकंट्रोलिंग ट्टी से अलग करने के लिए उपयोग करता है ।

आप इसे शेल फ़ंक्शन में रख सकते हैं:

fork() { (setsid "$@" &); }

fork emacs

संभावनाएं हैं:

  • disownअंतर्निहित आदेश:

    emacs &
    disown $!
    

    &कमांड सेपरेटर के रूप में कार्य करता है, और disownसबसे हालिया नौकरी के लिए डिफ़ॉल्ट होगा, इसलिए इसे छोटा किया जा सकता है:

    emacs & disown
    
  • डबल- fork():

    (emacs &)
    

    कोष्ठक के अंदर कमांड ( )को एक अलग शेल प्रक्रिया में चलाया जाता है।

  • setsid, जैसा कि रिच द्वारा सुझाया गया है, सबसे अच्छा विकल्प हो सकता है, क्योंकि यह एक नया सत्र बनाकर प्रक्रिया की नियंत्रित TTY को अनसेट करता है :

    setsid emacs
    

    हालांकि, यह थोड़ा अप्रत्याशित भी है - यह केवल fork()पृष्ठभूमि के लिए होगा यदि यह एक प्रक्रिया समूह का नेता है (जो कि स्क्रिप्ट setsidमें उपयोग होने पर ऐसा नहीं होगा sh, उदाहरण के लिए, ऐसे अवसरों में यह केवल Ctrl के लिए प्रतिरोधी बन जाएगा; सी।)


महान! ये सब मेरे लिए काम करते हैं। मेरे शस्त्रागार में कुछ और उपकरण होना अच्छा लगा।
स्लीगॉकी

हम्म ... (exec emacs)काम करेगा ?
हेल्लो 71

@ हेलो: यह सिर्फ से अलग नहीं होगा (emacs)। यदि उपधारा को एक ही आदेश दिया execजाता है, तो निहित है, कम से कम के मामले में bashbash -c 'foo'बनाम पर लागू होता है bash -c 'exec foo'। (हालांकि, ध्यान दें कि emacs खुद को टर्मिनल से अलग कर सकते हैं; उदाहरण के लिए gvim, यह करता है। ज्ञात व्यवहार के साथ एक कार्यक्रम के साथ परीक्षण करना बेहतर है।)
ग्रेविस

डबल-फोर्क तकनीक सीखने के लिए महान; धन्यवाद!
डेव अब्राहम

अपनी खुद की एक समस्या को ठीक करने के लिए ट्रोलिंग के दौरान यह मिला। मेरे लिए (सेटिड एमएसीएस एंड) ने काम किया। एक अच्छी तरह से लिखित उत्तर के लिए धन्यवाद।
पॉलब

5

आप खोल सेटिंग्स की जाँच करें। आप इसके बजाय स्क्रीन भी आज़मा सकते हैं nohup


स्क्रीन आपको बाद में प्रक्रिया में वापस लाने की अनुमति देता है screen -rयदि आप Ctrl-A Ctrl-Dलॉग आउट करने से पहले इसे डिस्कनेक्ट करने के लिए उपयोग करते हैं।
ब्रैम

यह बहुत अच्छी बात है। मुझे इसके विपरीत की आवश्यकता थी, यानी एक सब-थैली के लिए धन्यवाद और इसके पूरा होने की प्रतीक्षा किए बिना अन्य कार्यों के साथ आगे बढ़ना, लेकिन screen -d -m sh -c "{do stuff } exit"बहुत अधिक समझ में आता है।
निमो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.