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.

Reich
quelle

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
Petr Uzel
quelle
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.

Gilles 'SO - hör auf böse zu sein'
quelle
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
Serguei Fedorov
quelle