रनिंग प्रक्रिया के आउटपुट पुनर्निर्देशन को कैसे बदलें?


11

मुझे पता है कि आउटपुट को रीडायरेक्ट कैसे किया जाता है और कैसे उन्हें बैश में दबाया जाता है। अब, मान लें कि मैं गलती से आउटपुट पुनर्निर्देशन भाग को कमांड (जैसे 2>&1या > /tmp/mystdout) में जोड़ना भूल गया और मेरी पृष्ठभूमि प्रक्रिया पहले से ही थोड़ी देर के लिए चल रही है, क्या मैं अभी भी बदल सकता हूं stdoutऔर कहां stderrलिखा जा रहा है? मैं वास्तव में आवेदन को मारने और पुनः आरंभ नहीं करना चाहूंगा।

गाइल्स द्वारा उनकी टिप्पणी में पूछे गए अधिक विशिष्ट होने के लिए , मैं इन परिदृश्यों में विशिष्ट रूप से इसके साथ जुड़ना चाहूंगा:

  • गलत आउटपुट फ़ाइल
  • पर पुनर्निर्देशित stderrकरना भूल गयाstdout

या दोनों का एक संयोजन

जैसे मेरे पास अपाचे चल रहे हैं और मैं फाइल डिस्क्रिप्टर देख सकता हूं :

/proc/8019/fd/0 -> /dev/null
/proc/8019/fd/1 -> /dev/null
/proc/8019/fd/2 -> /var/log/apache2/error.log

दूसरे टर्मिनल में बदलें? या एक फाइल के लिए? यदि आप वर्तमान टर्मिनल या एक नए स्क्रीन सत्र में संलग्न होने के साथ संतुष्ट हैं, तो मैं
गिल्स एसओ- बुराई को रोकना '

जवाबों:


8

आप इसे reredirect ( https://github.com/jerome-pouiller/reredirect/ ) का उपयोग करके कर सकते हैं ।

reredirect -m /dev/null <PID>

आप बाद में अपनी प्रक्रिया के आरंभिक आउटपुट को कुछ इस तरह से उपयोग करके पुनर्स्थापित कर सकते हैं:

reredirect -N -O <M> -E <N> <PID>

( <M>और <N>पूर्वव्यापी लॉन्च द्वारा प्रदान किए गए हैं)।

रीडायरेक्ट READMEयह भी बताता है कि किसी अन्य कमांड पर रीडायरेक्ट कैसे करें या केवल स्टडआउट या स्टेडर को रीडायरेक्ट करें।


3

यह संभव नहीं है। या कम से कम आसान नहीं है। आप कुछ किस्मत प्रक्रिया में gdb संलग्न कर सकते हैं और इसके साथ gdb में fiddling कर सकते हैं, लेकिन इससे सफलता जितनी आसानी से क्रैश हो सकती है।



बेझिझक उन्हें साझा करें, मैं उत्तर दूंगा :)
डेनिस करसेमेकर


1
काफी नहीं। अन्य बग में जुड़े सभी उपकरण दूसरे टर्मिनल / स्क्रीन सत्र में संलग्न करने के बारे में हैं। किसी अन्य फ़ाइल पर रीडायरेक्ट करने के बारे में नहीं। हालांकि इसकी बजाय फ़ाइल को रीडायरेक्ट करने के लिए रेप्टियर को पैच करना मुश्किल नहीं है।
डेनिस करसेमेकर

मैंने रेप्टियर के स्रोत में थोड़ा सा देखा है और मैं उत्तर के "आसान नहीं" भाग से सबसे अधिक सहमत हूं। हो सकता है कि इसमें कुछ समय बाद गहरा गोता लग जाए।
gertvdijk

2

आपको अपने नए वर्तमान टर्मिनल के लिए एक और प्रक्रिया संलग्न करने के लिए reptyr का उपयोग करना चाहिए । उदाहरण के लिए: जीएनयू की screenउपयोगिता को स्थापित और उपयोग करें , और इसमें reptyrअन्य प्रक्रिया के पुनर्निर्देशन (और नियंत्रण टर्मिनल) को "लाने" के लिए कमांड लॉन्च करें और उन्हें नए वर्तमान टर्मिनल ( screenप्रक्रिया, यदि आप लॉन्च किया reptyrगया है screen) से संलग्न करें । एक screenसत्र से ऐसा करने का लाभ यह है कि, एक बार तहत screen, इसे फिर से डिस्कनेक्ट और फिर से कनेक्ट करना आसान होगा (उदाहरण के लिए, अपने स्थानीय सत्र को बंद करना, घर जाना और इसे फिर से खोलना)।


आपके उत्तर के लिए धन्यवाद, लेकिन यह मेरे मामले में मेरी मदद नहीं करता है क्योंकि मैं टर्मिनल डिटैच / रीटच के बारे में नहीं पूछ रहा हूं। कृपया मेरे प्रश्न और विशिष्ट में उदाहरण को फिर से पढ़ें।
gertvdijk

उस स्थिति में, आह: पुनरावृत्ति कोड पढ़ें, यह पता लगाएं कि इसे केवल पुनर्निर्देशित स्टडआउट या स्टेडर में कैसे संशोधित किया जाए। फिर इसे दूसरे शेल से चलाएं जो उस नई-जुड़ी स्ट्रीम को रीडायरेक्ट करता है जहां आप इसे जाना चाहते हैं? (या, बेहतर, रेप्टियर स्रोत का उपयोग करते हुए, प्रत्यक्ष रूप से पुनर्निर्देशन करें)
ओलिवियर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.