Ist es möglich, die Ausgabe eines beliebigen Prozesses mithilfe seiner PID zu lesen?

32

Ist es möglich, ein Terminal an einen bereits laufenden Prozess anzuhängen, indem seine PID auf ähnliche Weise wie der fgBefehl für Jobs verwendet wird?

Tommy
quelle
wie was ?! Was ist der Prozess, den Sie anhängen möchten ?!
Ich möchte in der Lage sein, die Ausgabe eines Programms anzuzeigen, das in einem anderen Terminal gestartet wurde
Tommy

Antworten:

43

Sie können die Standard-Dateideskriptoren dieses Prozesses abrufen, z stdout.

tail -f /proc/<pid>/fd/1
Jorge Castro
quelle
8
Ich habe diese Lösung mit top ausprobiert und es scheint nicht zu funktionieren. In einem Terminal habe ich top gestartet und in einem anderen habe ich Ihren Befehl mit der entsprechenden pid verwendet, aber keine Ausgabe erhalten.
Tommy
1
Wie machst du das auf einem Mac?
Avner Barr
was ist mit stderr? Ich nehme an, / proc / <pid> / fd / 2, aber wie bekommt man dann beide stdout / stderr?
Alexander Mills
1
Was ist, wenn dieser Deskriptor auf einen Socket verweist? Schwanz kann es nicht lesen. # ls -la /proc/24510/fd/1 lrwx------ 1 root root 64 Oct 31 08:34 /proc/24510/fd/1 -> socket:[444026]
Imaskar sagt Reinstate Monica
8

Hier gibt es einige Möglichkeiten. Eine besteht darin, die Ausgabe des Befehls in eine Datei umzuleiten und dann zu verwendentail neue Zeilen anzuzeigen, die dieser Datei in Echtzeit hinzugefügt werden.

Eine andere Möglichkeit besteht darin, Ihr Programm innerhalb von zu starten screen, einer Art textbasierter Terminal-Anwendung. Bildschirmsitzungen können angefügt und getrennt werden, sind jedoch grundsätzlich nur für den gleichen Benutzer gedacht, wenn Sie sie also für mehrere Benutzer freigeben möchten.

Wenn Sie möchten, können Sie den Prozess auch nachverfolgen und sehen, wie er abläuft strace:

strace -e trace=open -p 22254 -s 80 -o output.txt
  • -p PID: Fügen Sie dem Prozess die Prozess-ID PID hinzu und beginnen Sie mit der Ablaufverfolgung.
  • -s SIZE: Geben Sie die maximale zu druckende Zeichenfolge an (die Standardeinstellung ist 32).
  • -o filename: Schreibe die Trace-Ausgabe in die Datei filename anstatt auf screen (stderr).
Olorin
quelle
Endlich scheint es nicht zu funktionieren. Ich habe top gestartet und in einem anderen habe ich Ihren Befehl mit der entsprechenden pid verwendet, aber nicht die erwartete Ausgabe erhalten. Wenn ich den Schwanz danach benutze.
Tommy
Sie müssen sudomit strace eine Verknüpfung zu einem Prozess herstellen und verwenden, -o ~/output.txtdamit die Datei in Ihrem Basisordner verbleibt .
Verwenden Sie die Ausgabedatei, senden Sie sie nicht an den Bildschirm! Sei kein Idiot wie ich und drücke Strg-C, um aus der Spannung zu geraten und dann meine PID zu lösen. Erschreckte mich in einem wichtigen Drehbuch.
Weston Ganger
3

Mit den folgenden Befehlen können Sie einen laufenden Prozess an ein anderes Terminal anhängen:

  • retty(Manpage: retty )
  • reptyr
  • screen

Beispiel:

screen -S PID
retty $(pgrep PID)
reptyr PID
devav2
quelle
Ich war nicht in der Lage, Steg oder Wiederholung zu finden. Um den Bildschirm verwenden zu können, muss der ursprüngliche Prozess damit gestartet werden, damit mein Problem nicht behoben wird.
Tommy
Sie können es mit dem Befehl installieren, sudo apt-get install rettyaber mit retty gibt es nur wenige Einschränkungen. Schauen Sie sich die in der Antwort erwähnte Manpage an.
Devav2