我使用socat拦截UDP消息并将它们发送到指定的管道:
socat UDP-LISTEN:9999,fork PIPE:/tmp/mypipe,append
我能够跟踪这个管道,看到它接收到的所有信息。
我想通过管道将tail -f /tmp/mypipe的输出传输到sed,以便对消息进行一些后处理,但不幸的是,其中有些消息并没有以换行符结尾。这是一个问题,因为它意味着多个不同的UDP消息可能位于同一行,而且如果未终止,tail -f /tmp/mypipe | sed ...也不会传递最后一行。
理想情况下,我希望能够在将消息分隔符发送到管道时添加一个自定义消息分隔符,这样我就可以轻松地找到消息边界。如果这是不可能的,那么有什么方法我可以遵循这个文件和管道的最后(可能是未终止的)行到另一个程序进行后处理?
发布于 2018-07-28 08:34:33
一种不涉及分叉的可能性是使用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发布于 2019-12-30 14:18:13
使用sed,它可以用单个命令追加新行,以避免在使用SYSTEM:"cat; echo \"\n\""输出时出现争用条件:
socat -u UDP-RECVFROM:9999,fork SYSTEM:"sed -e a\\\\"
https://unix.stackexchange.com/questions/458951
复制相似问题