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

Я пытаюсь отправить небольшую строку в 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?

4 ответа

Решение

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

while read line; do
    printf "folder.counter:value|1c" | socat -t 0 - UDP:$host:$port
done

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

Знаю, что это старый пост, но я подумал, что все равно внесу свой вклад. У меня была такая же проблема; решил это с помощью -c опция:

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

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

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

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

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

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

Другие вопросы по тегам