2008-11-20 11 views
5

Ich arbeite an einem Anwendungscontroller für ein Programm, das Text direkt an/dev/tty spuckt.Eine direkte Umleitung nach/dev/tty fangen

Dies ist ein Produktionsanwendungscontroller, der in der Lage sein muss, den gesamten zum Terminal gehenden Text abzufangen. Im Allgemeinen ist dies kein Problem. Wir leiten stdout und stderr einfach um. Diese spezielle Anwendung führt direkte Aufrufe von echo aus und leitet das Ergebnis an/dev/tty (echo "some text" > /dev/tty) um. Redirects über meinen Anwendungscontroller können den Text nicht abfangen.

Ich habe die Quelle für diese Anwendung, bin aber nicht in der Lage, sie zu ändern, noch wird sie weiter gepflegt. Irgendwelche Ideen, wie man die Ausgabe fängt und/oder wegwirft?

Antwort

2

Ich kann nicht ganz fest, ob das Programm screen von @flolo erwähnt werden tun, was Sie brauchen oder nicht. Es kann sein, aber ich bin mir nicht sicher, ob es eine Logging-Anlage eingebaut ist, die scheint, was Sie brauchen.

Es gibt wahrscheinlich ein Programm da draußen, um zu tun, was Sie brauchen. Ich würde sudosh als eine Möglichkeit nominieren.

Wenn Sie Ihre eigenen schreiben müssen, müssen Sie wahrscheinlich eine Pseudo-Tty (Pty) verwenden und Ihren Anwendungscontroller zwischen der realen Terminalverbindung des Benutzers und dem Pty-Gerät sitzen lassen, wo es möglich ist Protokollieren Sie alles, was Sie zum Loggen benötigen. Das ist nicht trivial. Informationen dazu finden Sie in Rochkinds Buch "Advanced UNIX Programming, 2nd Edn", und zweifellos andere ähnliche Bücher (Stevens "Advanced Programming in the UNIX Environment" Buch ist ein wahrscheinlicher Kandidat, aber ich habe keine Kopie, um dies zu überprüfen).

4
screen -D -m yourEvilProgram 

sollte funktionieren. Viel Zeit verging sinced Ich benutzte es, aber wenn Sie etwas von seiner Ausgabe lesen müssen, könnte es sogar möglich sein, dass Sie einige Sockets verwenden konnten, um es zu lesen.

[Added: zwei Links, Rackaid und Pixelbeat und die Homepage unter GNU]

3

Die klassische Lösung zum Steuern einer Anwendung wie dieser ist Expect, die Pseudo-Terminals einrichtet, protokolliert und die gesteuerte Anwendung von einem Skript aus steuert. Es ist mit vielen Beispielskripten ausgestattet, so dass Sie wahrscheinlich nur eines anpassen können, das Ihren Anforderungen entspricht.

3

Dies ist, was ich in Python hat

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