socat warte auf antwort

socat warte auf antwort

Ich verwende dies in einem Skript

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

aber das stoppt sofort und ich bekomme keine Antwort vom Server

wenn ich mache

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

es wird immer 5 secondsauch dann gewartet, wenn die Antwort erst nach 1 Sekunde vorliegen würde.

Gibt es eine Möglichkeit, den Befehl sofort zu stoppen, nachdem ich die erste Nachricht erhalten habe?

Antwort1

Angenommen, die Antwort ist eine durch eine neue Zeile getrennte Textzeile. Mit bashkönnten Sie immer Folgendes tun:

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

Dies würde zurückkehren, sobald eine Antwort vorliegt, und socatfür die verbleibende Zeit im Hintergrund laufen.

In zshmüssten Sie &am Ende der echo|socatPipeline ein hinzufügen, damit nicht darauf gewartet wird. Möglicherweise möchten Sie es bashauch für hinzufügen, um zukunftssicher zu sein, falls bashSie sich entscheiden, das Verhalten in Zukunft zu ändern.

Wenn die Antwort mehr als eine Zeile umfassen kann oder nicht durch eine neue Zeile getrennt ist, zshkönnen Sie Folgendes tun:

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

Das sysreadeingebauteeins read()Systemaufruf der Größe 8192. Das setzt voraus, dass socatdie Antwort in die Pipe geschrieben wird ineins write()Systemaufruf (was er tut).

Portabel können Sie ddhierfür immer auf Folgendes zurückgreifen:

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
)

(Beachten Sie, dass durch die Befehlsersetzung alle nachstehenden Zeilenumbruchzeichen entfernt werden.)

socatWenn Sie diese paar zusätzlichen Sekunden danach nicht mehr warten möchten , können Sie Folgendes tun:

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"
  }
)

verwandte Informationen