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.