Pipe um fluxo infinito para loop interno?

2

Eu já vi muitas coisas sobre o redirecionamento do stdout para um soquete TCP, mas nenhum exemplo real de como fazê-lo na prática, especificamente quando o fluxo de saída gerado pelo primeiro "comando" nunca termina.

Para falar sobre algo concreto, vamos pegar programas como servidores que normalmente produzem seu log infinitamente para stdout (bem, contanto que eles sejam executados). Se você redirecionar a saída para um arquivo de log no disco, esse arquivo estará sempre aberto (portanto, não legível por outros?) E crescerá infinitamente, o que eventualmente causará problemas.

Esta pode ser uma pergunta, mas não sei o que faz ou como fazê-lo.

  1. Como redirecionar a saída de um comando para o loop interno?
  2. Eu quero ter certeza de que os dados são enviados toda vez que algo é escrito para stdout, e que o pipe não vai esperar o fim do comando (nunca acontece idealmente!). Está certo?
  3. Se 2 for verdadeiro, existe um sistema de buffer para enviar blocos de dados quando atingir apenas um determinado tamanho?
  4. Você poderia me dar exemplos concretos de linha de comando para fazer o que foi dito acima?

Obrigado antecipadamente

    
por Sheljohn 28.06.2013 / 11:06

1 resposta

4

Use o netcat

  1. Instale netcat-tradicional ou netcat-openbsd .
  2. No lado do receptor, abra um soquete de escuta:

    nc -l 1234
    

    em que 1234 é o número da porta a ser ouvida. Por padrão, o netcat usa um soquete TCP. Isso será executado continuamente até receber um EOF. Se você precisar desativá-la, adicione a opção -q -1 (tempo limite de espera negativo - consulte manpage).

    Opcionalmente, redirecione a saída para um arquivo ou canalize-a, por exemplo:

    nc -l 1234 > mylogfile.log
    
  3. No final do remetente, ative o comando e canalize o stdout para o netcat:

    mycommand | nc 123.45.67.89 1234
    

    em que 123.45.67.89 é o endereço IP do final de escuta e 1234 é o número da porta novamente.

    Isso será executado continuamente (transmitindo os dados) até que mycommand produza um EOF.

Discussão

  

Como redirecionar a saída de um comando para o loop interno?

Eu não tenho certeza do que você quer dizer com o "circuito interno", mas redirecionar a saída é uma pergunta muito geral para o seu shell.

  

Eu quero ter certeza de que os dados são enviados toda vez que algo é escrito na saída padrão, e que o tubo não vai esperar para que o comando final (nunca acontece idealmente!). Está certo?

Pipes no shell não vão esperar por um EOF para passar os dados, até onde eu sei.

  

Se 2 for verdadeiro, existe um sistema de buffer para enviar blocos de dados quando ele atinge apenas um determinado tamanho?

Sim, os buffers gerais nos tubos, conforme descrito na sugestão de ignis em seu comentário : Question em UL:. Desligue o buffer na tubulação

O TCP lidará com buffers no nível do TCP.

    
por gertvdijk 28.06.2013 / 11:40