예

장치 파일에서 바이너리 스트림을 디버깅하고 있습니다. 출력을 실시간으로 16진수 값으로 인쇄하고 싶습니다.

지금까지 나는 이것을 사용했지만 tail -f /dev/ttyAPP2 | hexdump -C출력에서 ​​일부 바이트를 잃기 시작한 후에는 개행 문자가 발견될 때까지 데이터를 플러시하지 않기 때문에 이것이 나쁜 선택일 수 있다는 것을 깨달았습니다.

비공식이 있다바이너리 테일하지만 현재 해당 방법을 사용할 수 없으며 다른 방법으로 이를 달성하는 방법에 대한 제안을 찾고 있습니까?

먼저 tty가 원시 모드로 설정됩니다.

stty -F /dev/ttyAPP2 raw

이것은 장치를 들을 때 얻는 것입니다(이것이 실제 출력입니다).

root@Vdevice:/dev# hexdump -C < /dev/ttyAPP2
00000000  55 00 21 00 02 26 00 02  0b 00 09 02 06 01 00 01  
00000010  99 0c ec 45 4f 01 03 47  41 54 45 57 41 59 43 54 

그러나 예상되는 패키지는 다음과 같아야 합니다(실제 출력은 아님).

root@Vdevice:/dev# hexdump -C < /dev/ttyAPP2
00000000  55 00 21 00 02 26 00 02  0b 00 09 02 06 01 00 01  
00000010  99 0c ec 45 4f 01 03 47  41 54 45 57 41 59 43 54  
00000020  52 4c 00 00 00 00 00 8b  

패키지의 다른 부분은 두 번째 패키지가 도착할 때 인쇄됩니다. (이것이 실제 출력입니다.)

root@Vdevice:/dev# hexdump -C < /dev/ttyAPP2
00000000  55 00 21 00 02 26 00 02  0b 00 09 02 06 01 00 01  
00000010  99 0c ec 45 4f 01 03 47  41 54 45 57 41 59 43 54
00000020  52 4c 00 00 00 00 00 8b  55 00 21 00 02 26 00 02
00000030  0b 00 09 02 06 01 00 01  99 0c ec 45 4f 01 03 47
00000040  41 54 45 57 41 59 43 54  52 4c 00 00 00 00 00 8b

답변1

tail -ftty는 필요하지 않습니다 . EOF를 보내거나 라인 버퍼링인 경우 이를 구성해야 합니다.

stty -F/dev/ttyAPP2 raw

이제 당신은 할 수 있습니다 ...

cat /dev/ttyAPP2

...필요에 따라...

당신은 시도 할 수 있습니다...

</dev/ttyAPP2 \
dd bs=16 conv=sync | od -vtx1

...이것은 장치의 각 성공을 read()16바이트의 빈 패드 블록으로 동기화하므로 라인 버퍼링된 출력이 기록됩니다.(예: 터미널로)이는 처리량에 관계없이 실시간으로 작동하지만 후행 null이 있으면 스트림이 왜곡될 수 있습니다.

GNU stdbuf및 동적 연결 사용 od:

stdbuf -o0 od -vtx1 </dev/ttyAPP2

...어쨌든 출력은 실시간으로 기록됩니다.

다음과 같은 임시 파일로 버퍼링할 수도 있습니다.

f=$(mktemp)
exec 3<>"$f"; rm -- "$f"
while   dd >&3 of=/dev/fd/1 bs=4k count=1
        [ -s /dev/fd/3 ]
do      od -An -vtx1 /dev/fd/3
        echo
done    </dev/ttyAPP2 2>/dev/null

...다른 제안만큼 효율적이지는 않지만 EOF를 통해 장치에서 읽기를 분리하려는 경우 고려해 볼 가치가 있습니다. 어쨌든, 나는 이 기술이 tty로 작업할 때 가끔 유용하다고 생각합니다.

hexdump또한 사용자 정의 인쇄 형식을 사용하여 더 적은 바이트를 인쇄하도록 할 수도 있습니다 . 다음 예는 4바이트를 사용할 수 있을 때마다 인쇄합니다.

hexdump -e '4/1 "%02x " "\n"' < /dev/ttyAPP2

답변2

여러 줄(9줄) 솔루션이 괜찮다면 다음 hextail.sh스크립트를 확인하세요.

#!/usr/bin/env bash

#par1==buffsize, par2=xxd-columns-width, par3=sleepVal;    defaults: 256 16 0
size=${1:-256}; cols=${2:-16}; cnt=0; hbuff=$(eval printf '00%.0s' {1..$size})
while true; do
   hbuff=${hbuff:2}$(dd bs=1 count=1 2>/dev/null | xxd -p) #shiftLeft, add 1b
   printf '\033[;H'; xxd -r -p <<<$hbuff | xxd -g1 -c$cols #cursor gotoxy 1,1
   echo total bytes: $((++cnt)) ;   [ -z $3 ] || sleep $3  #...and buff show.
done

bash 문자열 변수에 16진수 표현을 저장하여 이진 테일링을 구현합니다. Buff의 첫 번째 바이트는 새 바이트가 끝에 추가되면서 제거됩니다.

테스트 명령 예:

1) cat /dev/urandom | ./hextail.sh 1024 32 0.2      ...with 200ms sleep
2) ./hextail.sh < /dev/ttyAPP2

관련 정보