我socat
用来拦截 UDP 消息并将它们发送到命名管道:
socat UDP-LISTEN:9999,fork PIPE:/tmp/mypipe,append
我能够跟踪此管道并查看它收到的所有消息。
我想通过管道输出tail -f /tmp/mypipe
tosed
对消息进行一些后处理,但不幸的是其中一些不是换行符终止的。这是一个问题,因为这意味着多个不同的 UDP 消息可能在同一行上,并且还因为tail -f /tmp/mypipe | sed ...
如果最后一行未终止,则不会通过最后一行。
理想情况下,我希望能够在将消息发送到我的管道时添加自定义消息分隔符,以便我可以轻松找到消息边界。如果这是不可能的,那么有什么方法可以让我按照这个文件并将最后(可能未终止的)行传输到另一个程序进行后处理?
不涉及分叉的一种可能性是使用
socat
详细输出而不是数据。我的版本socat -v
在详细输出中包含数据的长度,所以你知道它在哪里结束。例如,将在每个数据项(例如)之前输出一个以日期和长度
9430NONEWLINE
开头的标题。>
使用
sed
,它可以使用单个命令追加新行,以避免在使用SYSTEM:"cat; echo \"\n\""
输出时出现竞争条件:socat -u UDP-RECVFROM:9999,fork SYSTEM:"sed -e a\\\\"