देखने के लिए एक आउटपुट आउटपुट में संलग्न करें


111

मैं किसी एप्लिकेशन आउटपुट पर कंसोल / टर्मिनल-व्यू को कैसे 'अटैच' करूंगा ताकि मैं देख सकूं कि यह क्या कह रहा है?

मैं आवेदन को मार डाले बिना किसी एप्लिकेशन आउटपुट से कैसे अलग हो जाऊंगा?

आम तौर पर यदि आप कमांड लाइन का उपयोग करके एक बातूनी एप्लिकेशन को आग लगाते हैं तो आपको सभी प्रकार के अद्भुत आउटपुट मिलते हैं। हालाँकि, मान लें कि मेरे पास एक विशेष रूप से चैटिंग प्रोग्रामिंग है, जो किनो की तरह चल रही है, और मैं इसके आउटपुट को कमांड लाइन के माध्यम से पुनः आरंभ किए बिना किसी भी समय देखना चाहता हूं। मुझसे नहीं हो सकता; कम से कम मैं नहीं जानता कि कैसे।


1
क्या आपके पास अपनी प्रक्रिया में डिबग प्रतीक है? क्या यह उत्पादन environnement में चलता है? और यदि ऐसा है तो क्या आपको इसे रोकने की आवश्यकता है?
बौम्स

जब मुझे केनो (क्रैश और मेरी ध्वनि मारता है) जैसे अंत उपयोगकर्ता कार्यक्रमों के साथ स्थिरता के मुद्दों का सामना करना पड़ता है, तो मैं यह जानना चाहता हूं कि यह कैसे / क्यों दुर्घटनाग्रस्त हो गया ताकि मैं इसे ठीक करने पर काम कर सकूं। यह एक ऐसा कार्यक्रम नहीं है जिसे मैं विकसित कर रहा हूं, लेकिन एक ऐसी तकनीक जिसे मैं जानना चाहता हूं, ताकि शूटिंग में दिक्कत हो। मैं नीचे आपके सुझाव की कोशिश करूँगा।
एगिटान

जवाबों:


17

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

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


1
"यहां कुछ विकल्प हैं। एक फ़ाइल में कमांड के आउटपुट को पुनर्निर्देशित करना है, और फिर वास्तविक समय में उस फ़ाइल में जोड़ी गई नई लाइनों को देखने के लिए 'पूंछ' का उपयोग करना है।" क्या पहले से चल रहे आवेदनों के साथ ऐसा किया जा सकता है?
21

2
आपको आउटपुट प्राप्त करने के लिए संभवतः पूंछ -f $ log_file की आवश्यकता है क्योंकि यह फ़ाइल में लिखा गया है। इसके अलावा, नहीं, ऐसा कोई तरीका नहीं है जो मैं पहले से चल रहे ऐप के साथ करूं।
वारखान

@aggitan: नहीं। मौजूदा अनुप्रयोगों के लिए, आपको उन्हें फिर से चालू करना होगा, क्योंकि वे पहले ही अपने I / O को नियंत्रित करने वाले टर्मिनल से बांध चुके हैं।
डॉन


288

मुझे लगता है कि मेरे पास यहां एक सरल समाधान है। बस उस निर्देशिका की तलाश करें जिसका नाम पीआईडी ​​से मेल खाता है, जिसे आप छद्म-फाइलसिस्टम /procपथ के तहत सुलभ के तहत देख रहे हैं । तो अगर आपका कोई प्रोग्राम चल रहा है, जिसकी आईडी 1199 है, cdतो:

$ cd /proc/1199

फिर fdनीचे की निर्देशिका को देखें

$ cd fd

यह fdनिर्देशिका फ़ाइल-डिस्क्रिप्टर ऑब्जेक्ट्स को रखती है जो आपके प्रोग्राम का उपयोग कर रही है (0: stdin, 1: stdout, 2: stderr) और सिर्फ tail -fएक जिसकी आपको ज़रूरत है - इस मामले में, stdout):

$ tail -f 1

9
मैं उपयोग नहीं कर पाया tailक्योंकि मेरे मामले में आउटपुट को इनपुट के लिए किसी अन्य प्रक्रिया में रीडायरेक्ट किया गया था, लेकिन moreमुझे वर्तमान डेटा दिखाया गया।
.मेगा

10
इस साइट पर सबसे अधिक riveting पदों में से एक!
रोबर्ट

2
moreमेरे लिए काम कर रहा है। एक नोड प्रक्रिया पर ubuntu 14.04
शिह-मिन ली

1
यह मेरे लिए एक जावा प्रक्रिया के साथ काम नहीं कर रहा है जो System.out.println कहता है। कोई भी आउटपुट / / proc / [pid] / fd / 1
Nick

1
नीचे का उपयोग करके एक प्रजनन बनाने की कोशिश की, लेकिन कोई फायदा नहीं हुआ: `` docker रन -it --name कंटेनर 1 ubuntu bash -c -i "COUNT = 0; जबकि सच है; गूंज नृत्य मंजिल हरा जा रहा रखने; (?) COUNT ++)); सो 1; echo \ "गणना है: \ $ {COUNT} \"; किया; " `` `एक अन्य टर्मिनल में:` `
docker निष्पादित -it

54

मैं इसी सटीक चीज़ की तलाश में था और पाया कि आप यह कर सकते हैं:

strace -ewrite -p $PID

यह वही नहीं है जिसकी आपको आवश्यकता थी, लेकिन यह काफी करीब है।

मैंने आउटपुट पुनर्निर्देशित करने की कोशिश की, लेकिन यह मेरे लिए काम नहीं कर पाया। शायद इसलिए कि प्रक्रिया एक सॉकेट को लिख रही थी, मुझे नहीं पता।


धन्यवाद यह काम करता है, लेकिन आउटपुट को छोटा किया जाता है, उदाहरण के लिए पिंग: लिखना (1, "64 बाइट्स 1.0.0.1 से: icmp_seq =" ..., 56) = 56
izy

8

मैं किसी एप्लिकेशन आउटपुट पर कंसोल / टर्मिनल-व्यू को कैसे 'अटैच' करूंगा ताकि मैं देख सकूं कि यह क्या कह रहा है?

इस सवाल के बारे में, मुझे पता है कि आउटपुट को पकड़ना संभव है, तब भी जब आपने प्रॉसेस शुरू करने से पहले sceen कमांड लॉन्च नहीं किया था।

जब मैंने कभी कोशिश नहीं की, तो मुझे एक दिलचस्प लेख मिला है जो बताता है कि जीडीबी का उपयोग कैसे करना है (और आपकी प्रक्रिया को फिर से शुरू किए बिना)।

पुन: निर्देशित हो-उत्पादन-से-एक से चल-प्रक्रिया

मूल रूप से:

  1. अपनी प्रक्रिया के लिए खुली फ़ाइलों की सूची देखें, धन्यवाद / proc / xxx / fd के लिए
  2. GDB के साथ अपनी प्रक्रिया संलग्न करें
  3. जब यह रोक दिया जाता है, तो उस फ़ाइल को बंद करें जिसमें आप रुचि रखते हैं, बंद करने () फ़ंक्शन को कॉल कर रहे हैं (आप GDB में अपने किसी भी फ़ंक्शन को कर सकते हैं। मुझे संदेह है कि आपको अपनी प्रक्रिया में डीबग प्रतीकों की आवश्यकता है ..)
  4. बनाएँ () या ओपन () फ़ंक्शन को कॉल करते हुए एक नई फ़ाइल खोलें। (अंत में टिप्पणियों में एक नज़र है, आप देखेंगे कि लोगों को डुप 2 () का उपयोग करने का सुझाव दिया जाएगा ताकि यह सुनिश्चित हो सके कि एक ही हैंडल उपयोग में होगा)
  5. प्रक्रिया को अलग करें और चलाने दें।

वैसे, यदि आप i386 बॉक्स पर एक लिनक्स ओएस चला रहे हैं, तो टिप्पणियों में आउटपुट को एक नए कंसोल पर पुनर्निर्देशित करने के लिए एक बेहतर टूल के बारे में बात कर रहे हैं: 'रिट्टी' । यदि हां, तो इसके उपयोग पर विचार करें।


6

मेरे लिए, यह काम किया:

  1. प्रक्रिया के स्वामी के रूप में लॉगिन करें (यहां तक rootकि अनुमति से इनकार किया गया है)

    ~$ su - process_owner
    
  2. फ़ाइल डिस्क्रिप्टर को कई अन्य उत्तरों में बताए अनुसार पूंछें।

    ~$ tail -f /proc/<process-id>/fd/1 # (0: stdin, 1: stdout, 2: stderr)
    

2

मैं दूरस्थ रूप से एक यम अपग्रेड प्रक्रिया को देखना चाहता था जो स्थानीय स्तर पर चलाई गई थी, इसलिए ऐसा करने के लिए शायद अधिक कुशल तरीके थे, यहाँ मैंने क्या किया:

watch cat /dev/vcsa1

जाहिर है आप vcsa2, vcsa3, आदि का उपयोग करना चाहते हैं, जिसके आधार पर टर्मिनल का उपयोग किया जा रहा था।

जब तक मेरी टर्मिनल विंडो उसी चौड़ाई की थी जिस टर्मिनल पर कमांड चल रही थी, मैं हर दो सेकंड में उनके वर्तमान आउटपुट का एक स्नैपशॉट देख सकता था। अन्य आदेशों की सिफारिश की कहीं और मेरी स्थिति के लिए विशेष रूप से अच्छी तरह से काम नहीं किया, लेकिन यह एक चाल है।

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