socat 답변을 기다리세요

socat 답변을 기다리세요

나는 이것을 스크립트에서 사용합니다

echo $(echo "sign 00:07:32:46:04:75" | socat UDP4-DATAGRAM:239.192.0.2:9000 -)

하지만 이 작업은 즉시 중지되고 서버에서 응답이 없습니다.

만약 내가한다면

echo $(echo "sign 00:07:32:46:04:75" | socat -t5 UDP4-DATAGRAM:239.192.0.2:9000 -)

5 seconds1초 후에 응답이 가능할 때까지 항상 기다립니다 .

첫 번째 메시지를 받은 후 즉시 명령을 중지할 수 있는 방법이 있습니까?

답변1

대답이 개행으로 구분된 텍스트 줄이라고 가정하면 bash언제든지 다음을 수행할 수 있습니다.

IFS= read -r answer < <(
  echo 'sign 00:07:32:46:04:75' |
    socat -t 5 - UDP4-DATAGRAM:239.192.0.2:9000)

응답이 있는 즉시 반환되며 socat남은 시간 동안 백그라운드에서 계속 실행됩니다.

에서는 기다리지 않도록 파이프라인 끝에 zsh를 추가해야 합니다 . 나중에 동작을 변경하기로 결정한 경우 미래에도 사용할 수 있도록 실제로 추가하고 싶을 수도 있습니다 .&echo|socatbashbash

대답이 두 줄 이상일 수 있거나 개행으로 구분되지 않은 경우 다음을 zsh수행할 수 있습니다.

zmodload zsh/system
(echo 'sign 00:07:32:46:04:75' |
  socat -t 5 - UDP4-DATAGRAM:239.192.0.2:9000 &) | sysread answer

내장 sysread하나 read()크기 8192의 시스템 호출. 이는 socat파이프에 응답을 쓴다고 가정합니다.하나 write()시스템 호출(그렇습니다).

이식 가능한 경우 언제든지 다음을 사용할 수 있습니다 dd.

answer=$(
  (echo 'sign 00:07:32:46:04:75' |
    socat -t 5 - UDP4-DATAGRAM:239.192.0.2:9000 &) |
    dd bs=8192 count=1 2> /dev/null
)

(명령 대체는 모든 후행 개행 문자를 제거합니다.)

그 후 몇 초 동안 더 머물지 않으려면 socat다음과 같이 할 수 있습니다.

answer=$(
  (echo 'sign 00:07:32:46:04:75' |
    sh -c 'echo "$$"
           exec socat -t 5 - UDP4-DATAGRAM:239.192.0.2:9000 &
  ) | {
    IFS= read pid
    dd bs=8192 count=1 2> /dev/null
    kill -s PIPE "$pid"
  }
)

관련 정보