socat aguardar resposta

1

Eu uso isso em um script

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

mas isso pára imediatamente e não obtenho resposta do servidor

se eu fizer

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

ele sempre espera o 5 seconds também quando a repsonse estará disponível após 1 segundo.

Existe uma maneira de parar o comando imediatamente depois que recebi a primeira mensagem?

    
por user2071938 22.11.2017 / 11:02

1 resposta

2

Supondo que a resposta seja uma linha de texto delimitada por nova linha, com bash , você sempre pode fazer:

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

Isso retornaria assim que houvesse uma resposta e socat ficaria em segundo plano pelo tempo restante.

Em zsh , você precisaria adicionar & no final do echo|socat pipeline para não esperá-lo. Você pode querer adicioná-lo para bash e também para o futuro caso bash decida alterar o comportamento no futuro.

Se a resposta puder ser mais de uma linha ou não for delimitada por nova linha, com zsh você poderia fazer:

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

A sysread builtin faz uma read() chamada de sistema do tamanho 8192. Isso assume socat grava a resposta no canal em um write() system chamada (o que faz).

Portável, você sempre pode recorrer a dd para isso:

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
)

(note que a substituição de comandos retira todos os caracteres de nova linha).

Se você quisesse evitar socat esperando por alguns segundos extras depois disso, você poderia fazer algo como:

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"
  }
)
    
por 22.11.2017 / 11:26

Tags