![파이프되는 UDP 스트림 socat에 메시지 구분 기호를 추가하는 방법은 무엇입니까?](https://linux55.com/image/137674/%ED%8C%8C%EC%9D%B4%ED%94%84%EB%90%98%EB%8A%94%20UDP%20%EC%8A%A4%ED%8A%B8%EB%A6%BC%20socat%EC%97%90%20%EB%A9%94%EC%8B%9C%EC%A7%80%20%EA%B5%AC%EB%B6%84%20%EA%B8%B0%ED%98%B8%EB%A5%BC%20%EC%B6%94%EA%B0%80%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
socat
UDP 메시지를 가로채서 명명된 파이프로 보내는 데 사용하는 것 :
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\\\\"