nc (netcat) se cuelga, esperando más datos, en modo UDP.

16

Estoy tratando de enviar una pequeña cadena a statsd a través de nc dentro de un bloque de lectura:

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

Desafortunadamente, cuando está en modo UDP, nc parece querer esperar indefinidamente, a pesar de que he especificado -q 0, lo que dice la página de manual hará que el programa salga inmediatamente después de EOF.

He intentado pasar -w 1, pero si los datos que envío llegan a más de una línea por segundo, los datos se acumulan y pierdo mis estadísticas en tiempo real (sin mencionar el riesgo de un desbordamiento del búfer de algún tipo).

¿Es posible hacer lo que estoy tratando de hacer con netcat, o voy a necesitar escribir algo en un lenguaje que tenga una biblioteca de estadísticas?

bshacklett
fuente
aunque no resolvió el tuyo, agregar -q 0 resolvió mi problema
Colin
Esto sucede en modo TCP ahora, que es lo que me trajo aquí.
baitisj

Respuestas:

9

Terminé solucionando el problema cambiando a socat:

while read line; do
    printf "folder.counter:value|1c" | socat -t 0 - UDP:$host:$port
done
bshacklett
fuente
Como no ha habido otra entrada, y esto resolvió mi problema, lo estoy marcando como la respuesta.
bshacklett
Podría haber agregado un tiempo de espera de 1 segundo a netcat (agregar los argumentos -w 1 probablemente habría funcionado).
parkamark
7

Puede especificar 0 como un valor de tiempo de espera para -w, por lo que no esperará en absoluto.

Dániel
fuente
Esta debería ser la respuesta aceptada.
Petrus K.
3
El tiempo de espera cero es inaceptable, el error:invalid wait-time 0
AstraSerg
2

Agregar la opción -v resolvió mi problema. La razón por la que no estoy seguro.

Kousha
fuente
2

Tuve el mismo problema; lo resolvió usando la -copción:

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

entonces algo como

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

Sí, realmente no tiene sentido "cerrar" una conexión udp, pero eso terminó funcionando.

Jørn Christensen
fuente
Agregar -cresolvió mi problema connetcat (The GNU Netcat) 0.7.1
Noah Sussman
0

Para nosotros, fue que estábamos enviando una carga útil nc de una máquina a otra a través de un script de python. En Python, cuando codificamos explícitamente la carga útil en 'UTF-8', simplemente funcionó.

usuario1118473
fuente