Posso canalizar a saída de um processo iniciado? [duplicado]

2

Digamos que comecei program e continue escrevendo alguma saída para stdout. Existe alguma maneira de adicionar um pipe para que eu possa, por exemplo, contar o número de linhas que ele produziu com wc -l ?

    
por cheft 25.05.2018 / 22:08

2 respostas

1

Você pode fazer isso no Linux. Digamos que haja um script s :

#!/bin/bash
i=0
echo my pid: "$$"
while true; do
    echo "$i"; ((i++)); sleep 1; 
done

Execute:

$ ./s
my pid: 8815
0
1
2

E assim vai ... Agora você precisa de gdb para anexar ao processo.

gdb -p 8815

Agora você está em gdb . Aqui faça isso:

p close(1)

Isso fechou o descritor de arquivo STDOUT. Agora abra um novo:

p creat("/tmp/8815.out", 0600)

Em outro terminal, você já pode definir o processo de leitura:

tail -f /tmp/8815.out

Nada está vindo ainda, já que você precisa se separar de gdb no outro terminal. Ou Ctl + D ou:

q
Quit anyway? (y or n) 

Confirme com y e Digite . E agora você deve ver (onde o tail está sendo executado) algo assim:

173
174
175

Se você preferir usar um arquivo ou canal já existente, faça isso em gdb :

p open("/path/to/your/output", 1)

Isso ilustra o redirecionamento de STDOUT. É semelhante ao STDERR, só tem o número 2.

Eu usei estas duas respostas:

por 25.05.2018 / 23:45
0

Você pode usar tee quando iniciar o programa. Se você está usando o bash, você pode fazer:

program > >(tee -a log.txt)

Isso redirecionará o stdout de program para uma substituição de processo executando tee . Que essencialmente escreve uma cópia do stdout de program to log.txt . tee continuará enviando o stdout para onde quer que estivesse antes, provavelmente o terminal dependendo de como o program funciona.

    
por 25.05.2018 / 22:18