Capture a saída sem redirecionamento e deixe-a no terminal também

4

Eu preciso capturar a saída de um daemon que também inclui um modo on-demand e se comporta de maneira diferente dependendo se a saída vai para tty ou não. Apenas redirecionar a stdout para qualquer lugar faz com que ela entre no modo de logging, onde grava dados em formato inconveniente e em ATM, isso levaria muito tempo para reconfigurá-los para fazer o contrário / corrigir / perguntar ao autor.

Posso de alguma forma apenas executá-lo como de costume - ou seja, sem redirecionamento - mas ainda obter uma cópia de tudo o que ele escreve para a tela em um arquivo?

    
por Oleg V. Volkov 20.08.2015 / 14:10

1 resposta

5

Você pode usar socat para fazer o stdout de mydaemon de um dispositivo terminal e ter todos os dados gravados lá enviados para um canal em socat .

Aqui usando ls -l /proc/self/fd no lugar de mydaemon

$ socat  -u 'exec:"ls -l /proc/self/fd",pty,raw' - | tee file.out
total 0
lrwx------ 1 stephane stephane 64 Aug 20 13:32 0 -> /dev/pts/25
lrwx------ 1 stephane stephane 64 Aug 20 13:32 1 -> /dev/pts/26
lrwx------ 1 stephane stephane 64 Aug 20 13:32 2 -> /dev/pts/25
lr-x------ 1 stephane stephane 64 Aug 20 13:32 3 -> /proc/30930/fd

Veja como o stdout de ls é um novo dispositivo pty ( /dev/pts/26 )

Se você não tiver socat , também poderá usar script :

$ script -qc 'stty raw; ls -l /proc/self/fd' file.out < /dev/null
total 0
lrwx------ 1 stephane stephane 64 Aug 20 13:35 0 -> /dev/pts/26
lrwx------ 1 stephane stephane 64 Aug 20 13:35 1 -> /dev/pts/26
lrwx------ 1 stephane stephane 64 Aug 20 13:35 2 -> /dev/pts/26
lr-x------ 1 stephane stephane 64 Aug 20 13:35 3 -> /proc/31010/fd

(o < /dev/null é para que script não configure seu terminal no modo raw ).

Observe, entretanto, que nesse caso, todos os stdin, stdout e stderr são redirecionados para essa pty. Para stdin e stderr ficarem intocáveis como na abordagem socat , você poderia fazer:

$ script -qc 'stty raw; exec <&3 2>&4 3<&- 4>&-; ls -l /proc/self/fd' file.out 3<&0 4>&2 < /dev/null
total 0
lrwx------ 1 stephane stephane 64 Aug 20 13:37 0 -> /dev/pts/25
lrwx------ 1 stephane stephane 64 Aug 20 13:37 1 -> /dev/pts/26
lrwx------ 1 stephane stephane 64 Aug 20 13:37 2 -> /dev/pts/25
lr-x------ 1 stephane stephane 64 Aug 20 13:37 3 -> /proc/31065/fd

Nem todas as script implementations / versions suportam a opção -c ou -q .

Note que alguns sistemas vêm com um script unbuffer expect para isso, mas tenha cuidado com vários erros e limitações.

    
por 20.08.2015 / 14:33