2008-11-20 68 views
5

我正在爲直接將文本吐出到/ dev/tty的程序的應用程序控制器工作。捕獲直接重定向到/ dev/tty

這是一個生產應用程序控制器,必須能夠捕捉到終端的所有文本。一般來說,這不是問題。我們只是重定向stdout和stderr。這個特定的應用程序直接調用echo並將結果重定向到/ dev/tty(echo "some text" > /dev/tty)。通過我的應用程序控制器重定向無法捕捉文本。

我確實有這個應用程序的來源,但我無法修改它,也不再被維護。關於如何捕捉和/或丟棄輸出的任何想法?

回答

2

我不能完全確定由@flolo提到screen程序是否會做你需要或不是。它可能,但我不確定是否有內置的日誌工具,這似乎是你需要的。

可能有一個程序已經在那裏做你所需要的。我會提名sudosh作爲一種可能性。

如果你最終需要寫你自己的,你可能需要使用一個僞終端(PTY),讓您的應用程序控制器的用戶真實的終端連接,並且該pty設備,它可以與坐記錄你需要的任何記錄。這不是微不足道的。你可以在Rochkind的「Advanced UNIX Programming, 2nd Edn」這本書中找到關於這方面的信息,毫無疑問,其他類似的書(Stevens的「UNIX環境下的高級編程」一書可能是一個候選人,但我沒有副本來驗證)。

4
screen -D -m yourEvilProgram 

應該工作。我用了很多時間,但是如果你需要閱讀它的一些輸出,你甚至可以利用一些套接字來讀取它。

[新增:兩個環節,RackaidPixelbeat,以及主頁在GNU]

3

像這樣控制應用程序的經典解決方案是Expect,它設置僞終端,記錄日誌,並從腳本驅動受控應用程序。它帶有大量示例腳本,因此您可能只需調整一個即可滿足您的需求。

3

這是我在Python做

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