Erfassen Sie STDIN / STDERR / STDOUT eines Prozesses NACH dem Start über die Befehlszeile?

8

Danke! Mein Usercase: Ich habe einen langwierigen interaktiven "configure" -Prozess gestartet (sprich unter "screen"), und mir wurde klar, dass ich immer mit "no" antworten muss, bis ich ein bestimmtes Keyword sehe. Es scheint Zeitverschwendung, dies per Hand zu tun (um nicht zu sagen, dass ich das Schlüsselwort leicht übersehen kann ..)

So scheint es, dass ich eine Kopie von STDERR / STDOUT zu einem Filter pipen möchte, und auch in der Lage sein, in die STDIN eines (Konsolen-) Prozesses zu injizieren, NACH dem Start mit der Befehlszeile? Gibt es eine fertige Lösung?

Die folgenden Werkzeuge scheinen Hilfe zu sein. Um die Ausgabe zu erfassen, verwenden Sie

%Vor%

Es ist nicht so sauber (zeigt Zeilen wie: schreiben (#,)), aber funktioniert! Aber heißt handle UTF8 richtig?

Um die Ausgabe umzuleiten, machen Sie etwas wie

%Vor%

Aber es ist nicht klar, wie man das richtige Gerät findet.

    
John Quilder 28.01.2012, 18:08
quelle

3 Antworten

6

Gelöst in Linux (anscheinend Linux-spezifisch):

%Vor%

fügt einen Prozess an ein anderes Terminal an und / oder macht seine Eingabe und Ausgabe als Pipes verfügbar.

    
John Quilder 04.02.2012, 18:44
quelle
3

Das ist möglich, aber es ist nicht schön. Der Prozess ist wie folgt:

  1. Verwenden Sie gdb , um den bereits laufenden Prozess anzuhängen
  2. run p close(<fd>) wobei <fd> der Dateideskriptor ist, den Sie ändern möchten
  3. Führen Sie p creat("<path to file">, <perms>) aus, um die Ausgabe des geschlossenen fd an anderer Stelle zu senden

Siehe Dieser Link für detailliertere Informationen Information

    
SiegeX 28.01.2012 20:16
quelle
1

Warum willst du das machen?

Es ist nicht tragbar auf Posix-Weise möglich! Vielleicht könnte open -ing der /proc/1234/fd/0 und /proc/1234/fd/1 und /proc/1234/fd/3 Pseudo-Dateien (für Prozess 1234) eine hässliche Möglichkeit sein! Und selbst das könnte in einigen Fällen nicht funktionieren (z. B. für Rohre).

Insbesondere glaube ich, dass die Semantik von SIGPIPE , die an den Prozess gesendet wird, wenn niemand eine Pipe liest, gebrochen wäre ...

Und ich glaube nicht, dass Sie in der Lage wären, die pseudo-tty Qualität von z.B. stdout .

Sie finden also im Grunde genommen einen anderen Weg, Ihre allgemeinen Ziele zu erreichen, die Sie nicht explizit erklärt haben.

Wenn Ihr Anwendungsfall ein seltsames configure -Skript ist, könnten Sie es neu starten und mit einem eigenen Skript füttern (in Shell, Python, Perl, etc ...). Verlieren Sie keine Zeit, um einen vorhandenen configure -Prozess abzufangen, starten Sie ihn einfach neu.

Sehen Sie sich auch den Befehl screen an (und wie er implementiert wird!)

    
Basile Starynkevitch 28.01.2012 19:11
quelle

Tags und Links