nc (netcat) bleibt im UDP-Modus hängen und wartet auf weitere Daten.

16

Ich versuche, eine kleine Zeichenfolge innerhalb eines Leseblocks über nc an statsd zu senden:

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

Leider scheint nc im UDP-Modus auf unbestimmte Zeit warten zu wollen, obwohl ich angegeben habe -q 0, dass die Manpage besagt, dass das Programm sofort nach EOF beendet wird.

Ich habe versucht zu übergeben -w 1, aber wenn die Daten, die ich sende, mit mehr als einer Zeile pro Sekunde eingehen, werden die Daten gepuffert und ich verliere meine Echtzeit-Statistiken (ganz zu schweigen von dem Risiko eines Pufferüberlaufs).

Ist es möglich, das zu tun, was ich mit Netcat versuche, oder muss ich etwas in einer Sprache schreiben, die eine statsd-Bibliothek hat?

bshacklett
quelle
obwohl es nicht Ihre gelöst hat, Hinzufügen von -q 0 mein Problem gelöst
Colin
Dies geschieht jetzt im TCP-Modus, was mich hierher gebracht hat.
Baitisj

Antworten:

9

Am Ende habe ich das Problem behoben, indem ich zu folgendem gewechselt habe socat:

while read line; do
    printf "folder.counter:value|1c" | socat -t 0 - UDP:$host:$port
done
bshacklett
quelle
Da es keine weiteren Eingaben gab und dies mein Problem löste, markiere ich es als die Antwort.
bshacklett
Sie hätten netcat ein 1-Sekunden-Timeout hinzufügen können (das Hinzufügen der Argumente -w 1 hätte wahrscheinlich funktioniert).
Parkamark
7

Sie können 0 als Zeitüberschreitungswert für -w angeben, damit es überhaupt nicht wartet.

Dániel
quelle
Dies sollte die akzeptierte Antwort sein.
Petrus K.
3
Null-Timeout ist inakzeptabel, der Fehler:invalid wait-time 0
AstraSerg
2

Das Hinzufügen der Option -v löste mein Problem. Der Grund, warum ich nicht sicher bin.

Kousha
quelle
2

Ich hatte das gleiche Problem. löste es mit der -cOption:

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

so etwas wie

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

Ja, es ist nicht wirklich sinnvoll, eine udp-Verbindung zu "schließen" - aber das funktionierte schließlich.

Jørn Christensen
quelle
Das Hinzufügen -clöste mein Problem mitnetcat (The GNU Netcat) 0.7.1
Noah Sussman
0

Für uns war es so, dass wir eine nc-Nutzlast über ein Python-Skript von einer Maschine zu einer anderen sendeten. Als wir in der Python-Version die Nutzdaten explizit in 'UTF-8' verschlüsselt haben, hat es einfach funktioniert.

user1118473
quelle