nc (netcat) trava, aguardando mais dados, no modo UDP.

16

Estou tentando enviar uma pequena string para statsd via nc dentro de um bloco de leitura:

while read line; do
    printf "folder.counter:value|1c" | nc -q 0 -u $host $port
done

Infelizmente, quando no modo UDP, o nc parece querer esperar indefinidamente, mesmo que eu tenha especificado -q 0, o que a página de manual diz que fará o programa sair imediatamente após o EOF.

Tentei passar -w 1, mas se os dados que estou enviando chegarem a mais de uma linha por segundo, os dados serão armazenados em buffer e eu perco minhas estatísticas em tempo real (para não mencionar o risco de um buffer overflow de algum tipo).

É possível fazer o que estou tentando fazer com o netcat, ou vou precisar escrever algo em linguagem que tenha uma biblioteca statsd?

bshacklett
fonte
apesar de não resolver o seu, acrescentando q 0 resolvido o meu problema
Colin
Isso acontece no modo TCP agora, e foi isso que me trouxe aqui.
precisa saber é

Respostas:

9

Acabei corrigindo o problema alternando para socat:

while read line; do
    printf "folder.counter:value|1c" | socat -t 0 - UDP:$host:$port
done
bshacklett
fonte
Como não houve outra entrada, e isso resolveu o meu problema, estou marcando-a como a resposta.
precisa saber é o seguinte
Você poderia ter adicionado um tempo limite de 1 segundo ao netcat (adicionar os argumentos -w 1 provavelmente funcionaria).
parkamark 28/02
7

Você pode especificar 0 como um valor de tempo limite para -w, para que não espere nada.

Dániel
fonte
Essa deve ser a resposta aceita.
Petrus K.
3
Zero timeout é inaceitável, o erro:invalid wait-time 0
AstraSerg 26/09
2

a opção de adição -v resolveu meu problema. A razão pela qual não tenho certeza.

Kousha
fonte
2

Eu tive o mesmo problema; resolveu usando a -copção:

-c, --close                close connection on EOF from stdin

então algo como

while read line; do
    printf "folder.counter:value|1c" | nc -cu $host $port
done

Sim, realmente não faz sentido "fechar" uma conexão udp - mas isso acabou funcionando.

Jørn Christensen
fonte
Adicionando -cresolveu meu problema com #netcat (The GNU Netcat) 0.7.1
Noah Sussman
0

Para nós, estávamos enviando uma carga nc de uma máquina para outra através de um script python. No python, quando codificamos explicitamente a carga útil em 'UTF-8', apenas funcionou.

user1118473
fonte