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', это просто работало.