パイプされたUDPストリームsocatにメッセージ区切り文字を追加するには?

パイプされたUDPストリームsocatにメッセージ区切り文字を追加するには?

socatUDPメッセージを傍受して名前付きパイプに送信するために使用するもの:

socat UDP-LISTEN:9999,fork PIPE:/tmp/mypipe,append

このパイプを追跡して、受信したすべてのメッセージを表示できます。

メッセージをパイピングして後処理を実行したいのですが、残念ながらメッセージの一部は改行で終わりませんtail -f /tmp/mypipesedこれは、複数の異なるUDPメッセージが同じ行にある可能性があり、tail -f /tmp/mypipe | sed ...最後の行が終了しないと通過できないために問題になります。

理想的には、メッセージがパイプラインに送信されるときにカスタムメッセージ区切り文字を追加して、メッセージ境界を簡単に見つけることができるようにしたいと思います。これが不可能な場合は、ファイルを追跡し、最後の(終了しない)行を後処理のために別のプログラムにパイプする方法はありますか?

ベストアンサー1

分岐を含まない1つの可能性は、socatデータの代わりに詳細な出力を使用することです。私のバージョンにはsocat -v詳細な出力のデータ長が含まれており、終わりがどこにあるかを知ることができます。例えば、

mkfifo mypipe
while sleep 3
do    printf "%sNONEWLINE" $RANDOM
done |
socat -u - UDP4:localhost:9999  &
socat -u -v UDP-RECV:9999 - >/dev/null 2>mypipe  &
cat -uv mypipe

9430NONEWLINE日付と長さで始まるヘッダーは、各データ項目の前に出力されます(例:)。>

> 2018/07/28 10:29:33.965222  length=13 from=0 to=12
9430NONEWLINE> 2018/07/28 10:29:36.968335  length=14 from=13 to=26
26947NONEWLINE> 2018/07/28 10:29:39.971025  length=14 from=27 to=40
15126NONEWLINE

おすすめ記事