Question nc (netcat) se bloque, en attente de plus de données, en mode UDP.


J'essaie d'envoyer une petite chaîne à statsd via nc à l'intérieur d'un bloc de lecture:

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

Malheureusement, en mode UDP, nc semble vouloir attendre indéfiniment, même si j’ai spécifié -q 0qui, selon la page de manuel, fera sortir le programme immédiatement après EOF.

J'ai essayé de passer -w 1, mais si les données que je vous envoie arrivent à plus d’une ligne par seconde, les données s’amortissent et je perds mes statistiques en temps réel (sans parler du risque de débordement de mémoire tampon).

Est-il possible de faire ce que j'essaye de faire avec netcat, ou vais-je devoir écrire quelque chose dans un langage qui possède une bibliothèque statsd?


14
2018-04-12 19:09


origine


Bien que cela n'ait pas résolu le vôtre, l'ajout de -q 0 a résolu mon problème. - Colin
Cela se produit maintenant en mode TCP, c'est ce qui m'a amené ici. - baitisj


Réponses:


J'ai fini par régler le problème en passant à socat:

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

8
2018-04-12 20:33



Comme il n'y a eu aucune autre contribution et que cela a résolu mon problème, je le marque comme la réponse. - bshacklett
Vous auriez pu ajouter un délai d'attente de 1 seconde à netcat (l'ajout des arguments -w 1 aurait probablement fonctionné). - parkamark


Vous pouvez spécifier 0 comme valeur de délai d'attente pour -w, afin d'éviter toute attente.


6
2018-06-24 10:19



Super astuce merci! - Antony
Cela devrait être la réponse acceptée. - Petrus K.
Zero timeout est inacceptable, l'erreur: invalid wait-time 0 - AstraSerg


l'ajout de l'option -v a résolu mon problème. La raison pour laquelle je ne suis pas sûr.


2
2018-05-18 20:35





Sachez que ceci est un ancien post, mais je pensais que je contribuerais quand même. J'ai eu le même problème; résolu en utilisant le -c option:

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

donc quelque chose comme

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

Ouais, ça n'a pas vraiment de sens de "fermer" une connexion UDP - mais ça a fini par marcher.


1
2018-02-28 13:49



Ajouter -c résolu mon problème avec netcat (The GNU Netcat) 0.7.1 - Noah Sussman