2012-08-04 13 views
5

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

मैं यूनिक्स के लिए नया हूं इसलिए आपकी अतिरिक्त जानकारी मेरी मदद करेगी।

+2

आप पहले अपना प्रयास क्यों नहीं करते? पृष्ठभूमि में एक प्रक्रिया शुरू करें, लॉग आउट करें और फिर से 'ps' के साथ जांचें कि क्या प्रक्रिया अभी भी – patrix

+0

के आसपास है, यह मुझे एक दिलचस्प और उपयोगी प्रश्न के रूप में चलाती है। मुझे संदेह है कि टर्मिनल के माध्यम से शुरू की जाने वाली प्रक्रियाओं को मार दिया जाएगा जब टर्मिनल मारे जाएंगे। ईमानदारी से, यह मेरे लिए एक कांटा की तरह लगता है, हालांकि मुझे नहीं पता, मुझे कभी कांटा का आह्वान करने की आवश्यकता नहीं है। – Dale

+0

यदि आप [nohup] (http://en.wikipedia.org/wiki/Nohup) कमांड का उपयोग नहीं करते हैं, तब तक जब आप लॉगआउट या अन्यथा अपना सत्र खो देते हैं तो प्रक्रिया मारे जाती है :) लेकिन यह सुनिश्चित नहीं है कि आप प्रक्रिया को वापस प्राप्त कर सकते हैं या नहीं एक नया सत्र –

उत्तर

5

तुम भी screen आदेश सोच सकते हैं। इसमें "मेरे सत्र को पुनर्स्थापित करें" कार्यक्षमता है। माना जाता है कि मैंने कभी इसका इस्तेमाल नहीं किया है, और इसके बारे में भूल गया है।

प्रक्रिया को एक डेमॉन के रूप में शुरू करना, या nohup री-कैप्चरिंग स्टडआउट/स्टडीन के संदर्भ में, जो कुछ भी आप चाहते हैं, वह नहीं कर सकते हैं।

वेब पर उदाहरणों का एक समूह है। गूगल पर की कोशिश, "यूनिक्स स्क्रीन आदेश" और "यूनिक्स स्क्रीन ट्यूटोरियल":

3

सबसे पहले गूगल "यूनिक्स एक प्रक्रिया दुष्प्रचार" के लिए परिणाम:

एक संक्षिप्त अवलोकन के लिए डेमॉन (3) मैनपेज देखें। को डिमोनिज़ करने की मुख्य बात पृष्ठभूमि छोड़ने या कुछ भी पकड़ने के बिना पृष्ठभूमि में जा रही है। चीजों की एक सूची के लिए एक प्रक्रिया कर सकते हैं इस लक्ष्य को हासिल करने के लिए:

  • कांटा()
  • setsid()
  • पास/पुनर्निर्देशित stdin/stdout/stderr करने के लिए/dev/बातिल, और/या उपेक्षा SIGHUP/SIGPIPE।
  • chdir() से /।

यदि रूट प्रक्रिया के रूप में शुरू किया गया है, तो आप उन चीजों को भी करना चाहते हैं जिन्हें आपको रूट के लिए रूट करना होगा, और फिर विशेषाधिकार छोड़ दें। यही है, प्रभावी उपयोगकर्ता को "डेमॉन" उपयोगकर्ता या "कोई भी" setuid()/setgid() के साथ बदलें। यदि आप सभी विशेषाधिकारों को छोड़ नहीं सकते हैं और कभी-कभी रूट पहुंच की आवश्यकता है, तो आवश्यकतानुसार इसे अस्थायी ड्रॉप करने के लिए seteuid() का उपयोग करें।

यदि आप एक डिमन फोर्क कर रहे हैं तो बच्चे के हैंडलर भी सेट करें और, अगर कॉलिंग को कॉल करते हैं, सभी फाइल डिस्क्रिप्टरों पर निष्पादन झंडे पर बंद करें, तो आपके बच्चों को इसकी आवश्यकता नहीं होगी।

और यहाँ यूनिक्स डेमॉन बनाने पर एक विधिपत्र है: http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html

+1

मुझे लगता है कि कम या ज्यादा। अगर/मुझे डेमॉन लिखने की ज़रूरत है, तो मुझे यकीन है कि मुझे अपने सभी बकवास को Google/stackoverflow करना होगा। – Dale

13

आदेश आप के लिए त्याग देते है देख रहे हैं।

disown <processid> 

यह उतना करीब है जितना आप नोहुप प्राप्त कर सकते हैं। यह वर्तमान लॉगिन से प्रक्रिया को अलग करता है और इसे जारी रखने की अनुमति देता है। धन्यवाद डेविड कॉर्न!

http://www2.research.att.com/~gsf/man/man1/disown.html

और मैं सिर्फ पाया reptyr जो आपको एक अस्वीकृत प्रक्रिया reparent सुविधा देता है। https://github.com/nelhage/reptyr

यह पहले से ही उबंटू के पैकेज में है।

लेकिन अगर आपने अभी तक प्रक्रिया शुरू नहीं की है और आप भविष्य में ऐसा करने की योजना बना रहे हैं तो screen और tmux पर जाने का तरीका है। मैं screen पसंद करता हूं।

0

'इंटरैक्ट के साथ' कुछ चीजों का मतलब हो सकता है।

कारण है कि एक प्रोग्राम, कमांड लाइन पर शुरू हुआ, टर्मिनल समाप्त होने पर निकलता है, क्योंकि शेल, जब यह निकलता है, तो उस प्रक्रिया को एक एचयूपी सिग्नल भेजता है (कुछ परिचय के लिए kill(1) के लिए प्रलेखन देखें; एचयूपी, द्वारा वैसे, 'लटका' के लिए छोटा है, और मूल रूप से संकेत दिया कि उपयोगकर्ता ने मॉडेम/टेलीफोन लटका दिया था)। एक एचयूपी सिग्नल के लिए डिफ़ॉल्ट प्रतिक्रिया यह है कि एक प्रक्रिया समाप्त हो जाती है - यानी, आवंटित कार्यक्रम निकलता है।

विवरण थोड़ा अधिक स्पष्ट रूप से हैं, लेकिन यह सामान्य अंतर्ज्ञान है।

nohup कमांड प्रोग्राम शुरू करने के लिए खोल को बताता है, और ऐसा करने के लिए इस एचयूपी सिग्नल को अनदेखा किया गया है। यही है, कार्यक्रम चलने वाले टर्मिनल से बाहर निकलने के बाद चल रहा है।

तुम अब भी यह संकेत भेज कर इस कार्यक्रम के साथ बातचीत कर सकते हैं (kill(1) फिर से देख), लेकिन इस बातचीत का एक बहुत ही सीमित तरह है, और अपने कार्यक्रम पर निर्भर करता है समझदार काम करने के लिए लिखा जा रहा है, जब यह उन संकेतों (संकेतों USR1 प्राप्त करता है और USR2 जाल के लिए उपयोगी चीजें हैं, अगर आप उस तरह की चीज में हैं)। वैकल्पिक रूप से, आप नामित पाइप, या सेमफोर, या इंटर-प्रोसेस संचार (आईपीसी) के अन्य बिट्स के माध्यम से बातचीत कर सकते हैं। यह बहुत जल्दी जल्दी हो जाता है।

मुझे संदेह है कि आप क्या कर रहे हैं, हालांकि, प्रक्रिया के लिए टर्मिनल को दोबारा जोड़ने में सक्षम है। यह एक और अधिक जटिल प्रक्रिया है, और screen जैसे अनुप्रयोग ऐसा करने के लिए दृश्यों के पीछे उचित जटिल चीजें करते हैं।

nohup चीज एक प्रकार का त्वरित और गंदा डिमनिसेशन है। daemon(3) फ़ंक्शन डेमोनिसेशन 'ठीक से' करता है, जो यूपीएचआईसीके के उत्तर में वर्णित अनुसार साफ-सफाई के विभिन्न बिट्स कर रहा है, जो इसे लागू करने वाली प्रक्रिया/टर्मिनल के साथ लिंक को व्यापक रूप से तोड़ने के लिए करता है। आप उपरोक्त के समान आईपीसी उपकरण के साथ उस डिमनीकृत प्रक्रिया के साथ बातचीत कर सकते हैं, लेकिन टर्मिनल के साथ सीधे नहीं।

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