Siehe die STDOUT-Umleitung eines laufenden Prozesses


17

Wenn ich eine App mit diesem Befehl starte:

/path/to/my/command >> /var/log/command.log

Und der Befehl kehrt nicht zurück. Gibt es eine Möglichkeit, an einer anderen Eingabeaufforderung zu erkennen, auf welche Weise die STDOUT-Umleitung eingestellt ist?

Ich suche sowas auch nicht

cat /proc/PID/redirects

oder

ps -??? | grep PID

aber jede Methode wird ausreichen.

Antworten:


22

Checken Sie den Dateideskriptor # 1 (STDOUT) in aus /proc/$PID/fd/. Der Kernel stellt diese Datei als symbolischen Link zu einer Datei dar, zu der der Deskriptor umgeleitet wird.

$ readlink -f /proc/20361/fd/1
/tmp/file

Perfekt! Vielen Dank! Können Sie einen Link oder Details zu den anderen Weiterleitungen wie STDERR angeben, dh welche Nummern sind das?
— Rich

Zumindest unter Linux (und ich glaube bei jedem anderen bekannten UNIX-ähnlichen Betriebssystem) sind es 0: stdin, 1: stdout, 2: stderr (Standardfehler). Beachten Sie, dass in <stdio.h> auch C-Makros definiert sind: STD {IN, OUT, ERR} _FILENO. Siehe 'man stdout' für Details.
— Petr Uzel

0, 1, 2 für stdin, stdout und stderr sind in allen Unix / Unix-ähnlichen Systemen garantiert und gelten auch für Windows.
— Paul Stelian

wie geht das unter MacOS? das / proc / <pid> / fd / 1 existiert nicht, vielleicht kann ich mkfifo benutzen?
— Alexander Mills

4

Ein nützliches Tool, um zu sehen, welche Dateien von welchen Prozessen geöffnet werden lsof. Mit können Sie auf einen bestimmten Prozess verweisen lsof -p1234, und Sie sehen meist die gleichen Informationen, die Sie ls -l /proc/1234/fdunter Linux erhalten können, dh, welche Dateien geöffnet sind.

Am nützlichsten lsofist es, umgekehrt vorzugehen: lsof /path/to/fileZeigt an, welche Prozesse diese Datei verwenden.


1

In vielen Antworten wird erwähnt, dass dies so geschieht:

tail -f /proc/{PID}/fd/1

Ich habe jedoch festgestellt, dass es nicht immer funktioniert. Alternativ catliefert das manchmal Ergebnisse.

cat /proc/{PID}/fd/1

Wobei {PID} mit dem ps auxBefehl gesucht werden kann .

Gut zu erwähnen ist auch, dass die Nummer am Ende des Befehls (in diesem Fall fd / 1) für andere Ausgänge geändert werden kann.

 /proc/{PID}/fd/0 # STDIN
 /proc/{PID}/fd/1 # STDOUT
 /proc/{PID}/fd/2 # STDERR
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.