Como eu compartilho o stdout entre vários processos?

2

Eu quero receber fluxo TCP ao vivo e torná-lo legível por outros processos ao mesmo tempo, sem salvá-lo.

Por exemplo, 111.222.233.244:1234 transmite o tempo real. O servidor suporta apenas uma conexão.

TTY1:

$ nc 111.222.233.244 1234 | (do something here) /tmp/tcpstream &
$ sleep 5 # stream is received even if there is no process that reads it
$ cat /tmp/tcpstream # it can also be like '(some command) | cat -'
17:00:06
17:00:07
17:00:08
17:00:09
17:00:10
17:00:11

TTY2 (segundo cat executado 9 segundos depois de executar nc ):

$ cat /tmp/tcpstream
17:00:09
17:00:10
17:00:11
    
por m132 29.01.2014 / 20:31

2 respostas

1

Talvez a ferramenta tcpclone possa ajudar você. Ele escuta conexões de entrada em uma determinada porta e qualquer dado lido da entrada padrão é encaminhado para essas conexões.

Seu exemplo deve se tornar algo assim:

$ nc 111.222.233.244 1234 | ./tcpclone 5555 &
$ nc 127.0.0.1 5555
    
por 30.01.2014 / 17:32
1

Não sei se entendi totalmente o seu problema, mas e:

$ nc 111.222.233.244 1234 \
    | tee -a /tmp/stream.dump \
    | while ! do_something_here; do : ; done

Além do despejo óbvio do fluxo no arquivo com tee (anexação, já que a rede pode ser desconectada por vários motivos e talvez você não queira necessariamente sobrescrever parte anterior do fluxo), isso reaparecerá do_somehing_here a menos que saia corretamente. Portanto, se do_somehing_here for, por exemplo, um script de wrapper, você poderá eliminar o que for realmente chamado, o que faz o script sair de forma anormal e ser novamente gerado imediatamente. Se você editar o script antes de eliminá-lo, o processamento do fluxo pode ser alterado sem reconectar.

    
por 29.01.2014 / 23:10