Veja o redirecionamento STDOUT de um processo em execução


17

Se eu iniciar um aplicativo com este comando:

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

E o comando não retorna, existe uma maneira, em outro prompt, para ver o que o redirecionamento STDOUT está definido?

Estou procurando algo como

cat /proc/PID/redirects

ou

ps -??? | grep PID

mas qualquer método serve.

Respostas:


22

Confira o descritor de arquivo nº 1 (STDOUT) em /proc/$PID/fd/. O kernel representa esse arquivo como um link simbólico para um arquivo ao qual o descritor é redirecionado.

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

Perfeito! Obrigado! Você pode fornecer um link ou detalhes sobre outros redirecionamentos, como STDERR, ou seja, quais são os números?
— Rich

Pelo menos no Linux (e acredito em todos os outros SOs conhecidos como UNIX), eles são 0: stdin, 1: stdout, 2: stderr (erro padrão). Observe que também existem macros C definidas em <stdio.h>: STD {IN, OUT, ERR} _FILENO. Veja 'man stdout' para detalhes.
— Petr Uzel

0, 1, 2 para stdin, stdout e stderr, respectivamente, são garantidos em todos os sistemas Unix / Unix, e também são verdadeiros no Windows.
— Paul Stelian

no MacOS alguma maneira de fazer isso? o / proc / <pid> / fd / 1 não existe, talvez eu possa usar o mkfifo?
— Alexander Mills

4

Uma ferramenta útil para ver quais arquivos são abertos por quais processos lsof. Você pode apontar para um processo específico com lsof -p1234, e verá principalmente as mesmas informações que pode obter ls -l /proc/1234/fdno Linux, ou seja, quais arquivos são abertos.

A coisa mais útil lsofé o contrário: lsof /path/to/fileinforma quais processos estão usando esse arquivo.


1

Muitas respostas mencionam fazê-lo desta maneira:

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

No entanto, descobri que nem sempre funciona. Alternativamente, às catvezes produz resultados.

cat /proc/{PID}/fd/1

onde {PID} pode ser consultado usando o ps auxcomando

Também é bom mencionar que o número no final do comando (neste caso, fd / 1) pode ser alterado para outras saídas.

 /proc/{PID}/fd/0 # STDIN
 /proc/{PID}/fd/1 # STDOUT
 /proc/{PID}/fd/2 # STDERR
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.