उस प्रक्रिया के आउटपुट का क्या होता है जिसे विघटित किया गया है और उसका टर्मिनल खो गया है?


26

यदि मैं वर्चुअल टर्मिनल को बंद कर देता हूं, जहां कुछ प्रक्रिया शुरू की गई थी, तो क्या आउटपुट सीधे जाता है /dev/null, या यह किसी भी तरह मेमोरी को प्रदूषित कर सकता है? क्या मैं किसी भी तरह से किसी भी बिंदु पर इसे पढ़ने के लिए जारी रखने के लिए आउटपुट को पकड़ सकता हूं?

[संपादित करें]: तो, क्या इसके उत्पादन को नियंत्रित करने के लिए एक प्रक्रिया को प्रभावी ढंग से समाप्त करने का क्षण मेरी शक्ति है?

मैंने यह भी देखा, कि अगर मैंने एक रुकी हुई प्रक्रिया को समाप्त कर दिया, तो सबसे पहले सब कुछ सामान्य लगता है: इसे न तो समाप्त किया गया और न ही नौकरियों में दिखाया गया। लेकिन अगर मैं लॉग आउट करता हूं (और मेरा मतलब टर्मिनल बंद नहीं है su, उदाहरण के लिए, बाहर निकलें ), तो प्रक्रिया समाप्त हो गई है। सभी एक ही, एक पृष्ठभूमि-चल रही प्रकटीकरण प्रक्रिया चल रह सकती है।


2
"क्या मैं किसी भी तरह आउटपुट को हड़प सकता हूं": बिना गंदे चाल के। लेकिन देखें कि मैं इसे कैसे चालू कर सकता हूं और इसे एक नए स्क्रीन शेल में जोड़ सकता हूं? और गंदे चाल के लिए अन्य उद्धृत प्रश्न (सभी प्रोग्राम पर डिबगर संलग्न करने पर आधारित हैं और किसी तरह इसे एक अलग आउटपुट फ़ाइल खोलते हैं)।
गिल्स एसओ- बुराई को रोकना '

उस सवाल के लिंक के लिए धन्यवाद। इसने मुझे अब तक का सबसे अच्छा जवाब दिया! खासकर चतुर rettyकार्यक्रम।
रोज़ज़ेट्रिएवेज़ेज़

1
संबंधित प्रश्न पर यह उत्तर भी देखें ।
स्टेफेन जिमेनेज

जवाबों:


11

तथ्य यह है कि एक प्रक्रिया "विघटित" है केवल इंटरैक्टिव शेल के लिए एक अर्थ है जिसने इस प्रक्रिया को बनाया है। इसका अर्थ यह है कि शेल अपने कार्य तालिका में प्रक्रिया को शामिल नहीं करता है (और) जब शेल बाहर निकलता है तो इस प्रक्रिया को इस प्रक्रिया में नहीं भेजा जाएगा। यह वास्तव में आपके सवालों से संबंधित नहीं है।

हटाए गए वर्चुअल टर्मिनल पर भेजे जाने वाले आउटपुट के बारे में क्या होता है: मैंने खुद कुछ परीक्षण किए, और मैंने देखा कि /dev/pts/xडिवाइस पहुंच योग्य नहीं हैं, और तब तक फिर से आवंटित नहीं किया जाएगा जब तक कि सभी फ़ाइलेस्क्रिप्ट्स उन्हें बंद नहीं कर देते। इसलिए, मैं एक कारण नहीं देख सकता कि हटाए गए टर्मिनल को क्यों लिखा जाता है। मुझे लगता है कि यह POSIX द्वारा परिभाषित नहीं है।

टर्मिनल को लिखने वाली कुछ प्रक्रिया के आउटपुट को हथियाने के बारे में, मुझे नहीं लगता कि यह तब भी संभव है, जब टर्मिनल अभी भी ज़िंदा है। आप बस टर्मिनल के लिए सीधे इनपुट को पकड़ सकते हैं (यानी कीस्ट्रोक्स, या सिम्युलेटेड कीस्ट्रोक्स को एक पाइट के मास्टर भाग द्वारा)। यदि प्रक्रियाएँ स्टडिन पर पढ़ी जाएँगी कि उनके टर्मिनलों को क्या लिखा गया है, तो अधिकांश प्रक्रिया के लिए एक स्वयं io लूप होगा।

प्रक्रिया समाप्ति पर अंतिम टिप्पणी के बारे में, मैं वास्तव में नहीं जानता कि क्या हो रहा है, लेकिन मुझे संकेतों (SIGTTOU, SIGTTIN, SIGHUP, या अन्य) के साथ अजीब व्यवहार पर संदेह होगा जो प्रक्रिया समूहों के अग्रभूमि / पृष्ठभूमि की स्थिति से संबंधित है, जब सत्र नेता बाहर निकलता है (उदाहरण के लिए su, आपके द्वारा बताए गए मामले में)।

संपादित करें का जवाब : नहीं, आउटपुट के संबंध में, जब एक प्रक्रिया को अस्वीकार कर दिया जाता है तो कुछ भी नहीं बदलता है: यह अभी भी इसके नियंत्रण टर्मिनल से जुड़ा हुआ है (जब तक कि यह पहले से ही अलग नहीं हो जाता है जैसे डेमॉन करते हैं)। आप इसका उपयोग करके देख सकते हैं ps। हालाँकि, आप इस प्रक्रिया के लिए शेल द्वारा प्रदान किए गए fg/ bg/ jobsआदेशों का उपयोग नहीं कर पाएंगे । इसका मतलब है कि टर्मिनल से इनपुट के साथ इसे फीड करना मुश्किल हो सकता है (अग्रभूमि प्रक्रिया समूह में होना आवश्यक है)।

-
1. जब तक कि प्रक्रिया कुछ डिबगिंग टूल्स के साथ तैयार या अपहृत न हो, (ऊपर टिप्पणियां देखें)।


1
इसे थोड़ा स्पष्ट करने के लिए धन्यवाद। वास्तव में एक प्रक्रिया को खंडित करने का तथ्य अभी भी मेरे प्रश्न से संबंधित है: एक प्रक्रिया को भंग करने के बाद, मैं इसके उत्पादन को नियंत्रित करने की क्षमता ढीली लगती हूं, है ना? (भले ही टर्मिनल नाइट बंद हो गया हो।) मैं उस मामले को शामिल करने के लिए प्रश्न को संपादित करूंगा।
rozcietrzewiacz

4

बस इस विशिष्ट प्रश्न को संबोधित करने के लिए:

यदि मैं वर्चुअल टर्मिनल बंद कर देता हूं, जहां कुछ प्रक्रिया शुरू की गई थी, तो क्या आउटपुट सीधे / dev / null में जाता है, या यह किसी भी तरह से मेमोरी को प्रदूषित कर सकता है?

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

जब आप वर्चुअल टर्मिनल बंद करते हैं, तो वर्चुअल टर्मिनल कनेक्शन का अपना अंत (pty "मास्टर") बंद कर देता है। उसके बाद, यदि कनेक्शन के दूसरे छोर पर प्रोग्राम टटी को लिखता है, तो एक त्रुटि वापस आ जाती है और डेटा कहीं भी नहीं जाता है। इसी तरह, अगर वह टटी से पढ़ता है तो उसे EOF (फ़ाइल का अंत) संकेतक वापस मिल जाएगा।


धन्यवाद - देखने के एक और अधिक प्रोग्रामिंग बिंदु से अच्छा और स्पष्ट विवरण।
rozcietrzewiacz

3

अपने प्रश्न के सबसे दिलचस्प हिस्से का उत्तर देने के लिए: लाइव रनिंग प्रोग्राम के आउटपुट को बदलने के लिए, आपको इसकी फ़ाइल डिस्क्रिप्टर को संपादित करना होगा। यह gdb के साथ करने के लिए काफी आसान है। यह हैक है, लेकिन काम करता है।

देख:

/programming/593724/redirect-stderr-stdout-of-a-process-after-its-been-started-using-command-line

एक सहायक स्क्रिप्ट http://users.linpro.no/ingvar/fdswap.sh.txt पर उपलब्ध है ।


0

गिल्स की टिप्पणी के लिए धन्यवाद, मुझे इस प्रश्न की ओर इशारा करते हुए , मैंने एक कार्यक्रम के बारे में सीखा, जिसे रिट्टी कहा जाता है ।

यह कुछ गंदे हैक का उपयोग करने के लिए लगता है reattach to a (pseudo-) tty प्रभावी ढंग से एक प्रक्रिया के उत्पादन को पढ़ने के लिए जारी रखने की अनुमति देता है - कोई फर्क नहीं पड़ता कि यह विस्थापित किया गया है या नहीं। तो यह मेरे सवाल के पहले भाग का जवाब देने के लिए लगता है। दूसरा जवाब स्टीफन ने दिया

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.