web-dev-qa-db-ja.com

nc(netcat)がハングし、UDPモードで追加のデータを待機します。

読み取りブロック内のncを介してstatsdに小さな文字列を送信しようとしています:

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

残念ながら、UDPモードの場合、-q 0を指定したにもかかわらず、ncは無期限に待機したいようです。これにより、manページには、EOFの直後にプログラムが終了するように記載されています。

私は-w 1を渡そうとしましたが、送信しているデータが1秒あたり1行を超えると、データがバッファリングし、リアルタイムの統計情報が失われます(バッファオーバーフローのリスクは言うまでもありません)ある種の)。

Netcatでやろうとしていることを実行することは可能ですか、それともstatsdライブラリを持つ言語で何かを記述する必要がありますか?

16
bshacklett

socatに切り替えることで問題を解決することになりました。

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

-wのタイムアウト値として0を指定できるため、まったく待機しません。

8
Dániel

同じ問題がありました。 -cオプションを使用して解決しました:

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

のようなもの

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

うん、udp-connectionを「閉じる」ことは実際には意味がありませんが、それでうまくいきました。

2

-vオプションを追加すると問題が解決しました。理由はわかりません。

2
Kousha

私たちにとっては、pythonスクリプトを使用して、あるマシンから別のマシンにncペイロードを送信していました。Pythonでは、 'UTF-8'でペイロードを明示的にエンコードすると、働いた。

0
user1118473