
socat
UDPメッセージを傍受して名前付きパイプに送信するために使用するもの:
socat UDP-LISTEN:9999,fork PIPE:/tmp/mypipe,append
このパイプを追跡して、受信したすべてのメッセージを表示できます。
メッセージをパイピングして後処理を実行したいのですが、残念ながらメッセージの一部は改行で終わりませんtail -f /tmp/mypipe
。sed
これは、複数の異なる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
答え2
を使用すると、出力を使用するときに競合状態をsed
回避するために、単一のコマンドで新しい行を追加できます。SYSTEM:"cat; echo \"\n\""
socat -u UDP-RECVFROM:9999,fork SYSTEM:"sed -e a\\\\"