Frage

Ich versuche, ein SIGINT strg + c in einer Leseschleife an einem Socket abzufangen, aber die gewünschte Unterbrechung wird erst nach einer neuen Zeile verarbeitet.Wenn ich also meine laufende App Strg + c drücke, muss ich warten, bis eine neue Zeile im Socket eintrifft, bevor die Schleife unterbrochen wird / die App beendet wird

Dies ist die Minimalversion :

trap "break" SIGINT SIGHUP SIGTERM
exec 3<>/dev/tcp/192.168.1.84/50885

while read line  
do   
   echo -e "$line\n" 
done <&3

Wie kann ich die Schleife sofort unterbrechen und die App beenden?

War es hilfreich?

Lösung

A break ist kein echter Befehl, den Sie ausführen können, wo immer Sie wollen;es ist lediglich ein syntaktisches Konstrukt, um einen Punkt zu markieren, an dem eine Umgebungsschleife verlassen werden soll.Ihrer break hat keine Umgebungsschleife, also macht es keinen Sinn (und ist ein Fehler: bash: break: only meaningful in a `for', `while', or `until' loop).

Sie müssen die töten read befehl stattdessen:

trap "killRead" SIGINT SIGHUP SIGTERM

killRead() {
  kill $(cat /tmp/read.pid)
}

exec 3<>/dev/tcp/192.168.1.84/50885

while read line  
do   
   echo -e "$line\n" 
done <&3 & pid=$!

echo $pid > /tmp/read.pid

wait $pid

Natürlich ist dies nur eine sehr grobe Lösung, die keine Fehlermeldungen verbirgt, die von terminierten Subshells usw. ausgegeben werden.Aber es zeigt die Idee und löst das Problem, nach dem Sie gefragt haben.Zum Ausblenden der erwarteten Fehlermeldung usw.vielleicht möchten Sie andere Fragen stellen (oder suchen Sie einfach hier nach bereits gegebenen Antworten ;-)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top