Voir la redirection STDOUT d'un processus en cours

17

Si je démarre une application avec cette commande:

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

Et la commande ne revient pas, existe-t-il un moyen, à partir d'une autre invite, de voir à quoi la redirection STDOUT est définie?

Je cherche quelque chose comme

cat /proc/PID/redirects

ou

ps -??? | grep PID

mais n'importe quelle méthode fera l'affaire.

Riches
la source

Réponses:

22

Consultez le descripteur de fichier # 1 (STDOUT) dans /proc/$PID/fd/. Le noyau représente ce fichier sous forme de lien symbolique vers un fichier vers lequel le descripteur est redirigé.

$ readlink -f /proc/20361/fd/1
/tmp/file
Petr Uzel
la source
Parfait! Merci! Pouvez-vous fournir un lien ou des détails sur les autres redirections telles que STDERR, c'est-à-dire de quels numéros il s'agit?
Rich
Au moins sous Linux (et je crois que sur tous les autres systèmes d'exploitation de type UNIX connus), ils sont 0: stdin, 1: stdout, 2: stderr (erreur standard). Notez qu'il existe également des macros C définies dans <stdio.h>: STD {IN, OUT, ERR} _FILENO. Voir «man stdout» pour plus de détails.
Petr Uzel
0, 1, 2 pour stdin, stdout et stderr respectivement sont garantis dans tous les systèmes Unix / Unix et sont également vrais sur Windows.
Paul Stelian
sur MacOS une façon de le faire? le / proc / <pid> / fd / 1 n'existe pas, peut-être puis-je utiliser mkfifo?
Alexander Mills
4

Un outil utile pour voir quels fichiers sont ouverts par quels processus lsof. Vous pouvez le diriger vers un processus spécifique avec lsof -p1234, et vous verrez principalement les mêmes informations que vous pouvez obtenir avec ls -l /proc/1234/fdLinux, c'est-à-dire quels fichiers sont ouverts.

La chose la plus utile avec lsofva dans l'autre sens: lsof /path/to/filevous indique quels processus utilisent ce fichier.

Gilles 'SO- arrête d'être méchant'
la source
1

Beaucoup de réponses mentionnent le faire de cette façon:

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

Cependant, j'ai trouvé que cela ne fonctionne pas toujours. Alternativement, le catparfois donne des résultats.

cat /proc/{PID}/fd/1

où {PID} peut être recherché à l'aide de la ps auxcommande.

Il est également bon de mentionner que le nombre à la fin de la commande (dans ce cas fd / 1) peut être modifié pour d'autres sorties.

 /proc/{PID}/fd/0 # STDIN
 /proc/{PID}/fd/1 # STDOUT
 /proc/{PID}/fd/2 # STDERR
Serguei Fedorov
la source