क्या पीआईडी ​​का उपयोग करके किसी भी प्रक्रिया से आउटपुट पढ़ना संभव है?


32

क्या fgनौकरियों के लिए कमांड का उपयोग करने के लिए इसी तरह से अपने पीआईडी ​​का उपयोग करके पहले से चल रही प्रक्रिया के लिए एक टर्मिनल संलग्न करना संभव है ?


जैसे क्या?! क्या प्रक्रिया है जिसे आप संलग्न करना चाहते हैं ?!

मैं एक कार्यक्रम के उत्पादन को देखने में सक्षम होना चाहूंगा जिसे दूसरे टर्मिनल में शुरू किया गया था
टॉमी

जवाबों:


43

आप उस प्रक्रिया के मानक फ़ाइल विवरणकों को प्राप्त कर सकते हैं, उदाहरण के लिए stdout:

tail -f /proc/<pid>/fd/1

8
मैंने शीर्ष के साथ इस समाधान की कोशिश की और यह काम नहीं करता है। एक टर्मिनल में मैंने शीर्ष लॉन्च किया और दूसरे में मैंने आपके आदेश का उपयोग corred pid के साथ किया, लेकिन कोई आउटपुट नहीं मिला।
टॉमी

1
आप इसे मैक पर कैसे करते हैं?
अवनर बर

क्या stderr के बारे में? मैं मान / खरीद / <pid> / fd / 2 करता हूं, लेकिन फिर आपको stdout / stderr दोनों कैसे मिलते हैं?
अलेक्जेंडर मिल्स

1
क्या होगा अगर यह डिस्क्रिप्टर एक सॉकेट की ओर इशारा करता है? टेल इसे पढ़ नहीं सकते। # ls -la /proc/24510/fd/1 lrwx------ 1 root root 64 Oct 31 08:34 /proc/24510/fd/1 -> socket:[444026]
इमस्कर का कहना है कि मोनिका

8

यहाँ कुछ विकल्प हैं। किसी एक फ़ाइल में कमांड के आउटपुट को रीडायरेक्ट करना है, और फिर tailउस फ़ाइल में वास्तविक समय में जोड़े जाने वाली नई लाइनों को देखने के लिए उपयोग करना है।

एक अन्य विकल्प यह है कि आप अपने प्रोग्राम को अंदर ही लॉन्च करें screen, जो एक तरह का टेक्स्ट-आधारित टर्मिनल एप्लिकेशन है। स्क्रीन सत्रों को संलग्न और अलग किया जा सकता है, लेकिन नाममात्र का अर्थ केवल उसी उपयोगकर्ता द्वारा उपयोग किया जाना है, इसलिए यदि आप उपयोगकर्ताओं के साथ साझा करना चाहते हैं।

यदि आप चाहें तो प्रक्रिया को ट्रेस कर सकते हैं और देख सकते हैं कि यह क्या कर रहा है strace:

strace -e trace=open -p 22254 -s 80 -o output.txt
  • -p PID: प्रक्रिया आईडी PID के साथ प्रक्रिया से जुड़ी और अनुरेखण शुरू करें।
  • -s SIZE: अधिकतम स्ट्रिंग आकार को प्रिंट करने के लिए निर्दिष्ट करें (डिफ़ॉल्ट 32 है)।
  • -o filename: स्क्रीन (stderr) के बजाय फ़ाइल फ़ाइल नाम के लिए ट्रेस आउटपुट लिखें।

अंत में यह काम नहीं करता है। मैंने शीर्ष लॉन्च किया और दूसरे में मैंने आपके आदेश का उपयोग corred pid के साथ किया, लेकिन अपेक्षित आउटपुट नहीं मिला। जब मैं बाद में पूंछ का उपयोग करता हूं।
टॉमी

sudoकिसी प्रक्रिया से जुड़ने के लिए आपको स्ट्रेस के साथ उपयोग करने की आवश्यकता होती है, और उपयोग -o ~/output.txtकरने के लिए फ़ाइल आपके घर के फोल्डर में रह जाती है।

आउटपुट फ़ाइल का उपयोग करें, स्क्रीन पर न भेजें! मैं जैसा था वैसा ही बेवकूफ बनूंगा और स्ट्रेस से बाहर निकलने के लिए Ctrl-C दबाऊंगा और फिर अपनी PID को अलग कर दूंगा। एक महत्वपूर्ण पटकथा पर मुझे बाहर निकाल दिया।
वेस्टन गैंगर West ’

3

आप नीचे दिए गए इन आदेशों का उपयोग किसी अन्य टर्मिनल पर चल रही प्रक्रिया को संलग्न करने के लिए कर सकते हैं:

उदाहरण:

screen -S PID
retty $(pgrep PID)
reptyr PID

मैं रिट्टी या रेप्ट्री नहीं ढूंढ पा रहा था। इसके अलावा, स्क्रीन का उपयोग करने में सक्षम होने के लिए मुझे इसके साथ मूल प्रक्रिया को लॉन्च करना होगा ताकि यह मेरे मुद्दे को हल न करे।
टॉमी

आप इसे कमांड का उपयोग करके स्थापित कर सकते sudo apt-get install rettyहैं लेकिन इसमें कुछ सीमाएँ हैं। उत्तर में उल्लिखित मैन पेज देखें।
देवव २
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.