nc (netcat) зависает, ожидая больше данных, в режиме UDP.

16

Я пытаюсь отправить небольшую строку в statsd через nc внутри блока чтения:

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

К сожалению, когда в режиме UDP nc, кажется, хочет ждать бесконечно, хотя я и указал -q 0, что, по словам справочной страницы, программа завершит работу сразу после EOF.

Я попытался передать -w 1, но если данные, которые я посылаю, поступают со скоростью более одной строки в секунду, данные буферизуются, и я теряю свою статистику в реальном времени (не говоря уже о риске переполнения буфера какого-то рода).

Можно ли сделать то, что я пытаюсь сделать с netcat, или мне нужно написать что-то на языке, который имеет библиотеку statsd?

bshacklett
источник
хотя это не решило вашу проблему, добавление -q 0 решило мою проблему
Колин
Теперь это происходит в режиме TCP, что и привело меня сюда.
baitisj

Ответы:

9

Я решил проблему, переключившись на socat:

while read line; do
    printf "folder.counter:value|1c" | socat -t 0 - UDP:$host:$port
done
bshacklett
источник
Поскольку не было никакого другого ввода, и это решило мою проблему, я отмечаю это как ответ.
bshacklett
Вы могли бы добавить 1 секунду для netcat (добавление аргументов -w 1, вероятно, сработало бы).
Parkamark
7

Вы можете указать 0 в качестве значения тайм-аута для -w, поэтому он вообще не будет ждать.

Dániel
источник
Это должен быть принятый ответ.
Петрус К.
3
Нулевой тайм-аут недопустим, ошибка:invalid wait-time 0
AstraSerg
2

добавление опции -v решило мою проблему. Причина, по которой я не уверен.

Kousha
источник
2

У меня была такая же проблема; решил это с помощью -cопции:

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

так что-то вроде

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

Да, на самом деле не имеет смысла «закрывать» udp-соединение - но это сработало.

Йорн Кристенсен
источник
Добавление -cрешило мою проблему сnetcat (The GNU Netcat) 0.7.1
Ноа Суссманом
0

Для нас это было то, что мы отправляли полезную нагрузку nc с одной машины на другую через скрипт python. В питоне, когда мы явно кодировали полезную нагрузку в 'UTF-8', это просто работало.

user1118473
источник