Ver la redirección STDOUT de un proceso en ejecución

17

Si inicio una aplicación con este comando:

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

Y el comando no regresa, ¿hay alguna forma, desde otro aviso, para ver en qué está configurada la redirección STDOUT?

Estoy buscando algo como

cat /proc/PID/redirects

o

ps -??? | grep PID

Pero cualquier método servirá.

Rico
fuente

Respuestas:

22

Consulte el descriptor de archivo # 1 (STDOUT) en /proc/$PID/fd/. El núcleo representa este archivo como un enlace simbólico a un archivo al que se redirige el descriptor.

$ readlink -f /proc/20361/fd/1
/tmp/file
Petr Uzel
fuente
¡Perfecto! ¡Gracias! ¿Puede proporcionar un enlace o detalles sobre los otros redireccionamientos como STDERR, es decir, qué números son?
Rico
Al menos en Linux (y creo que en cualquier otro sistema operativo conocido como UNIX) son 0: stdin, 1: stdout, 2: stderr (error estándar). Tenga en cuenta que también hay macros C definidas en <stdio.h>: STD {IN, OUT, ERR} _FILENO. Ver 'man stdout' para más detalles.
Petr Uzel
0, 1, 2 para stdin, stdout y stderr respectivamente están garantizados en todos los sistemas Unix / Unix-like, y también son ciertos en Windows.
Paul Stelian
en MacOS alguna forma de hacer esto? el / proc / <pid> / fd / 1 no existe, ¿tal vez pueda usar mkfifo?
Alexander Mills
4

Una herramienta útil para ver qué archivos se abren por procesos lsof. Puede apuntarlo a un proceso específico con lsof -p1234, y verá principalmente la misma información que puede obtener con ls -l /proc/1234/fdLinux, es decir, qué archivos se abren.

Lo más útil lsofes ir al revés: lsof /path/to/filele dice qué procesos están usando ese archivo.

Gilles 'SO- deja de ser malvado'
fuente
1

Muchas respuestas mencionan hacerlo de esta manera:

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

Sin embargo, he descubierto que no siempre funciona. Alternativamente, a catveces produce resultados.

cat /proc/{PID}/fd/1

donde {PID} se puede buscar con el ps auxcomando

También es bueno mencionar que el número al final del comando (en este caso fd / 1) se puede cambiar para otras salidas.

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