it-swarm.com.de

An eine Prozessausgabe zum Anzeigen anhängen

Wie kann ich eine Konsolen-/Terminalansicht an eine Anwendungsausgabe "anhängen", damit ich sehen kann, was es sagt?

Wie kann ich mich von einer Anwendungsausgabe trennen, ohne die Anwendung zu beenden?

Normalerweise, wenn Sie eine gesprächige Anwendung über die Befehlszeile starten, sehen Sie alle Arten von wunderbarer Ausgabe. Sagen wir jedoch, ich habe eine besonders gesprächige Programmierung, die wie KINO läuft, und ich möchte die Ausgabe jederzeit anzeigen, ohne sie über die Befehlszeile neu zu starten. Ich kann nicht, zumindest weiß ich nicht, wie. 

90
aggitan

Hier gibt es einige Möglichkeiten. Zum einen können Sie die Ausgabe des Befehls in eine Datei umleiten und dann mit 'tail' neue Zeilen anzeigen, die in Echtzeit zu dieser Datei hinzugefügt werden.

Eine weitere Option ist, Ihr Programm innerhalb von 'screen' zu starten, einer Art textbasierter Terminal-Anwendung. Bildschirmsitzungen können angefügt und getrennt werden, sind aber normalerweise nur für den gleichen Benutzer gedacht. Wenn Sie sie also für mehrere Benutzer freigeben möchten, ist dies ein großer Schmerz.

12
Don Werve

Ich denke, ich habe hier eine einfachere Lösung. Suchen Sie einfach nach einem Verzeichnis, dessen Name der von Ihnen gesuchten PID entspricht, unter dem Pseudo-Dateisystem, das unter dem Pfad /proc verfügbar ist. Wenn Sie also ein Programm ausführen, dessen ID 1199 lautet, geben Sie es ein:

$ cd /proc/1199

Suchen Sie dann nach dem Verzeichnis fd darunter

$ cd fd

Dieses fd-Verzeichnis enthält die Datei-Deskriptor-Objekte, die Ihr Programm verwendet (0: stdin, 1: stdout, 2: stderr) und nur tail -f der von Ihnen benötigten - in diesem Fall stdout -:

$ tail -f 1
234
licorna

Ich habe genau das gleiche gesucht und festgestellt, dass Sie folgendes tun können:

strace -ewrite -p $PID

nicht genau das, was du brauchst, aber es ist ziemlich nah

ich versuchte die Umleitungsausgabe, aber das funktionierte nicht für mich

40
Paul Scheltema

Wie würde ich eine .__ "anhängen"? Konsolen-/Terminalansicht auf eine Anwendungen ausgeben, damit ich was sehen kann kann es sagen?

Zu dieser Frage weiß ich, dass es möglich ist, die Ausgabe abzufangen, selbst wenn Sie den Befehl sceen nicht vor dem Starten des Processus gestartet haben.

Ich habe es zwar nie ausprobiert, aber ich habe einen interessanten Artikel gefunden, in dem erklärt wird, wie GDB verwendet wird (und ohne den Prozess neu zu starten).

Umleiten der Ausgabe von einem laufenden Prozess

Grundsätzlich gilt:

  1. Überprüfen Sie die Liste der geöffneten Dateien für Ihren Prozess dank / proc/xxx/fd.
  2. Fügen Sie Ihren Prozess mit GDB hinzu
  3. Schließen Sie während des Anhaltens die Datei, die Sie interessiert, und rufen Sie die Funktion close () auf (Sie können eine beliebige Funktion Ihres Prozesses in GDB verwenden. Ich vermute, Sie benötigen Debugsymbole in Ihrem Prozess.)
  4. Öffnen Sie die neue Datei, indem Sie die Funktion create () oder die Funktion open () aufrufen. (Schauen Sie sich am Ende die Kommentare an. Sie werden feststellen, dass die Benutzer dup2 () verwenden, um sicherzustellen, dass derselbe Handle verwendet wird.)
  5. Trennen Sie den Prozess und lassen Sie ihn laufen.

Wenn Sie ein Linux-Betriebssystem auf der i386-Box ausführen, wird in den Kommentaren ein besseres Werkzeug zum Umleiten der Ausgabe an eine neue Konsole beschrieben: 'retty'. Wenn ja, prüfen Sie die Verwendung.

6
yves Baumes

Ich wollte aus der Ferne einen Yum-Upgrade-Prozess ansehen, der lokal ausgeführt wurde. Obwohl es wahrscheinlich effizientere Möglichkeiten gab, dies zu tun, habe ich Folgendes getan:

beobachte cat/dev/vcsa1

Natürlich möchten Sie vcsa2, vcsa3 usw. verwenden, je nachdem, welches Terminal verwendet wurde.

solange mein Terminalfenster so breit war wie das Terminal, auf dem der Befehl ausgeführt wurde, konnte ich alle 2 Sekunden eine Momentaufnahme der aktuellen Ausgabe sehen. Die anderen Befehle, die an anderer Stelle empfohlen wurden, haben für meine Situation nicht besonders gut funktioniert, aber dieser hat den Trick geleistet.

1
RedScourge

Für mich hat das geklappt:

  1. Melden Sie sich als Eigentümer des Prozesses an (selbst root hat keine Berechtigung).

    ~$ su - process_owner
    
  2. Schließen Sie den Dateideskriptor an, wie in vielen anderen Antworten erwähnt.

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