我socat
用来拦截 UDP 消息并将它们发送到命名管道:
socat UDP-LISTEN:9999,fork PIPE:/tmp/mypipe,append
我能够跟踪这个管道并查看它收到的所有消息。
我想管的输出tail -f /tmp/mypipe
,以sed
做信息的一些后期处理,但不幸的是他们中的一些不换行终止。这是一个问题,因为这意味着多个不同的 UDP 消息可能在同一行上,而且还因为tail -f /tmp/mypipe | sed ...
如果未终止,则不会通过最后一行。
理想情况下,我希望能够在发送到我的管道时添加自定义消息分隔符,以便我可以轻松找到消息边界。如果这是不可能的,那么有什么方法可以遵循这个文件并将最终(可能未终止的)行通过管道传输到另一个程序进行后处理?
不涉及分叉的一种可能性是使用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
Run Code Online (Sandbox Code Playgroud)
将在每个数据项(例如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
Run Code Online (Sandbox Code Playgroud)