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.

Rico
fonte

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

Gilles 'SO- parar de ser mau'
fonte
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
Serguei Fedorov
fonte