파이프되는 UDP 스트림 socat에 메시지 구분 기호를 추가하는 방법은 무엇입니까?

파이프되는 UDP 스트림 socat에 메시지 구분 기호를 추가하는 방법은 무엇입니까?

socatUDP 메시지를 가로채서 명명된 파이프로 보내는 데 사용하는 것 :

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

이 파이프를 추적하여 수신되는 모든 메시지를 볼 수 있습니다.

메시지를 파이핑하여 후처리를 수행하고 싶지만 불행하게도 메시지 중 일부는 개행으로 끝나지 않습니다 tail -f /tmp/mypipe. sed이는 여러 다른 UDP 메시지가 동일한 라인에 있을 수 있다는 의미이기도 하고, tail -f /tmp/mypipe | sed ...마지막 라인이 종료되지 않으면 통과할 수 없기 때문에 문제가 됩니다.

이상적으로는 메시지가 파이프라인으로 전송될 때 사용자 지정 메시지 구분 기호를 추가하여 메시지 경계를 쉽게 찾을 수 있도록 하고 싶습니다. 이것이 가능하지 않은 경우 파일을 추적하고 마지막(종료되지 않은) 줄을 후처리를 위해 다른 프로그램으로 파이프할 수 있는 방법이 있습니까?

답변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\\\\"

관련 정보