2008-11-20 12 views
5

पर सीधे रीडायरेक्ट को पकड़ना मैं एक ऐसे प्रोग्राम के लिए एक एप्लिकेशन नियंत्रक पर काम कर रहा हूं जो पाठ को सीधे/dev/tty पर थूक रहा है।/dev/tty

यह एक उत्पादन अनुप्रयोग नियंत्रक है जो टर्मिनल पर जाने वाले सभी पाठों को पकड़ने में सक्षम होना चाहिए। आम तौर पर, यह कोई समस्या नहीं है। हम बस stdout और stderr पुनर्निर्देशित करते हैं। यह विशेष एप्लिकेशन परिणाम को प्रतिध्वनि बनाने और रीडायरेक्ट करने के लिए प्रत्यक्ष कॉल कर रहा है/dev/tty (echo "some text" > /dev/tty)। मेरे एप्लिकेशन नियंत्रक के माध्यम से रीडायरेक्ट टेक्स्ट को पकड़ने में विफल रहे हैं।

मेरे पास इस एप्लिकेशन का स्रोत है, लेकिन मैं इसे संशोधित करने की स्थिति में नहीं हूं, और न ही इसे बनाए रखा जा रहा है। आउटपुट को पकड़ने और/या फेंकने के बारे में कोई विचार?

उत्तर

2

मैं काफी निर्धारित नहीं कर सकता है कि क्या screen कार्यक्रम @flolo ने उल्लेख किया है कि तुम क्या नहीं की जरूरत है या नहीं होगा। यह हो सकता है, लेकिन मुझे यकीन नहीं है कि इसमें लॉगिंग सुविधा है या नहीं, जो आपको चाहिए।

शायद आपके पास पहले से ही एक प्रोग्राम है जो आपको चाहिए। मैं एक संभावना के रूप में sudosh नामांकित करेंगे।

यदि आप अपना खुद का लिखना चाहते हैं, तो आपको शायद एक छद्म-टीटी (पीटीआई) का उपयोग करने की आवश्यकता होगी और आपके एप्लिकेशन नियंत्रक को उपयोगकर्ता के वास्तविक टर्मिनल कनेक्शन और पीटीआई डिवाइस के बीच बैठना होगा, जहां यह कर सकता है लॉग इन करने के लिए आपको जो भी चाहिए उसे लॉग करें। यह तुच्छ नहीं है। आप रोचकिंड की "Advanced UNIX Programming, 2nd Edn" पुस्तक में इसके बारे में जानकारी प्राप्त कर सकते हैं, और इसमें कोई संदेह नहीं है कि अन्य समान किताबें (स्टीवंस "यूनिक्स पर्यावरण में उन्नत प्रोग्रामिंग" पुस्तक एक संभावित उम्मीदवार है, लेकिन मेरे पास इसकी पुष्टि करने के लिए कोई प्रति नहीं है)।

4
screen -D -m yourEvilProgram 

काम करना चाहिए। बहुत समय बीत चुका है मैंने इसका इस्तेमाल किया, लेकिन अगर आपको इसके कुछ आउटपुट को पढ़ने की ज़रूरत है तो यह भी संभव हो सकता है कि आप इसे पढ़ने के लिए कुछ सॉकेट का उपयोग कर सकें।

[जोड़ा गया: दो लिंक, GNU पर Rackaid और Pixelbeat, और मुख पृष्ठ]

3

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

3

यह है कि मैं क्या अजगर में किया था है

import pty, os 

pid, fd = pty.fork() 
if pid == 0: # In the child process execute another command 
    os.execv('./my-progr', ['']) 
    print "Execv never returns :-)" 
else: 
    while True: 
     try: 
      print os.read(fd,65536), 
     except OSError: 
      break