Você pode fazer isso usando strace.
Usando strace
, você pode espionar o que está sendo gravado no descritor de arquivo 1, que é o descritor de arquivo stdout. Aqui está um exemplo:
strace -p $pid_of_process_you_want_to_see_stdout_of 2>&1 | \
sed -re 's%^write\(1,[[:blank:]](.*),[[:blank:]]*[0-9]+\)[[:blank:]]*=[[:blank:]]*[0-9]+%%g'
Você pode querer melhorar o filtro, mas isso seria outra pergunta. Nós temos a saída, mas agora precisamos arrumar isso.
: AVISO: Esta solução tem algumas limitações, veja os comentários abaixo. Nem sempre funcionará, sua milhagem pode variar.
Teste:
Coloque este programa (abaixo) no arquivo hello
e chmod +x hello
#!/bin/bash
while true
do
echo -en "hello\nworld\n"
done
Este em hello1
e chmod +x hello1
#!/bin/bash
dir=$(dirname $0)
$dir/hello >/dev/null
Este em hello2
e chmod +x hello2
#!/bin/bash
dir=$(dirname $0)
$dir/hello1 >/dev/null
execute com ./hello2 >/dev/null
,
então encontre pid de processo hello e digite pid_of_process_you_want_to_see_stdout_of=xyz
onde xyz é o pid de olá,
então corra a linha no topo.
Como funciona.
Quando o hello é executado, o bash forks redireciona o fd1 para /dev/null
e executa o hello.
Olá envia a saída para fd1 usando a chamada do sistema write(1, …
.
O kernel recebe a chamada do sistema write(1, …
, vê que o fd 1 está conectado a /dev/null
e…
Em seguida, executamos strace (system-call trace) no olá e vemos que ele está chamando write(1, "hello\nworld\n")
O resto, se a linha acima estiver apenas selecionando a linha apropriada do traço.