Combina saída de múltiplos processos independentes em outro terminal

4

Como posso receber a saída de dois ou mais processos independentes em um terceiro local sem afetar os dois processos?

Eu tenho dois processos, A e B, cada um rodando em seu próprio screen , continuamente produzindo coisas.

Posso executar screen e anexar a A para ver sua saída:

12:00 Foo.
12:02 Foo.
12:04 Foo.

Mesmo com B:

12:01 Bar.
12:03 Bar.
12:05 Bar.

E eu posso combinar várias telas para ver lado a lado ou algo semelhante.

Mas estou procurando uma maneira de ver a saída desses dois processos combinados em um "fluxo" de mensagens:

12:00 Foo.
12:01 Bar.
12:02 Foo.
12:03 Bar.
12:04 Foo.
12:05 Bar.

Embora também não seja capaz de enviar inadvertidamente algo como CTRL + C para um dos processos. (Eu ainda quero poder me reconectar aos processos e interagir com eles de tempos em tempos, e é por isso que tenho usado screen .)

Assim, não acho que eu gostaria de executar os dois processos juntos e examinar a saída diretamente.

Eu poderia usar strace para fazer algo assim:

strace -PIDofA -e write &
strace -PIDofB -e write &

Mas a saída não é muito bonita:

write(1, "12:00 Foo.", 10) = 10
write(5, "Foo in file.", 12) = 12
write(1, "12:01 Bar.", 10) = 10
write(5, "Bar in file.", 12) = 12
...

e não parece ser uma boa solução executar vários strace desta forma para obter a saída combinada.

Talvez eu possa fazer os dois processos gravar em um arquivo e fazer algo como:

tail -f output.txt

Mas não tenho certeza se isso causará problemas quando o arquivo for preenchido com mais e mais linhas de saída.

E não sei ao certo o que acontece quando dois processos tentam gravar no mesmo arquivo ao mesmo tempo.

Então, que ferramenta eu uso ou como faço para redesenhar meus processos para exibir a saída de A e B juntos?

(Eu estou rodando isso no Debian e acessando através do ssh, se isso faz diferença.)

    
por Holistic IT 14.06.2017 / 16:56

2 respostas

2

Você pode canalizar a saída de cada comando para tee file e tail -f o arquivo. Não há sincronização entre os processos para que a saída seja intercalada (possivelmente de maneira feia). Se você estiver preocupado com o preenchimento do disco, poderá gerar uma saída para um pipe nomeado:

[first screen]
$ mkfifo /tmp/foo
$ tail -f /tmp/foo

[second screen]
$ command1 | tee /tmp/foo

[third screen]
$ command2 | tee /tmp/foo
    
por 14.06.2017 / 18:02
3

A maneira mais fácil parece ser usar os recursos de registro integrados da tela. Screen-Command-Key [controle-A], H, terá saída de log de tela para screenlog.«window» (por exemplo, screenlog.0 ). Se as duas telas estiverem no mesmo diretório (e forem o mesmo número de janela), elas acabarão gravando no mesmo arquivo de log - que parece fazer o que você deseja. Se eles estiverem em diferentes diretórios / diferentes números de janela, você poderá combinar esses dois arquivos, por exemplo, com tail -qf dir1/screenlog.0 dir2/screenlog.0 .

Note que a tela armazena um pouco a saída do buffer, então a mixagem não será perfeita. Você terá algumas linhas de um deles, depois alguns do outro, etc.

Você pode definir o nome do arquivo e o tempo de buffer com as opções logfile e logfile flush . Definir o tempo de descarga como 0 parece funcionar (Tecla de comando da tela,:, em seguida, digite logfile flush 0 e, em seguida, insira).

    
por 14.06.2017 / 17:17