Назад | Перейти на главную страницу

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?

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

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

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

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

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

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

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

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

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

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