Shell-Script: mit fortlaufenden ping-Werten arbeiten

Kryptaesthesie

Erfahrenes Mitglied
Hallo Runde :)

Ich möchte in einem Shellscript einen Befehl aufrufen und mit der Antwort arbeiten.
In meinem Fall möchte ich mit dem HCITOOL nach Bluetooth-Devices suchen.
Aber das Gleiche Verfahren haben wir auch beim ping-Befehl, wenn wir ihn so aufrufen, dass er dauerhaft läuft und nicht nach 10 pings endet.

Wie kann ich in einem Shellscript fortlaufend mit der Antwort arbeiten?
Gibt es dafür eine Lösung ohne die Rückgabe in eine Datei zu speichern und diese auszuwerten?

Schon mal vielen Dank für eure Hilfe :)
 
Ich weiß, ehrlich gesagt, nicht so richtig, ob ich mir das so vorstelle, @Bratkartoffel ...
Dieser Befehl schaltet den Buffer aus, wie er bspw. bei Pipe-Anweisungen aus Performance-Gründen automatisch vom System verwendet wird, richtig?
Ist das meine Lösung? Ob ich den Wert 5 Sekunden später erhalte, ist in meinem Fall nicht relevant.
Ich hätte gerne irgendein Konstrukt, in dem ich meinen Befehl aufrufe und dann eine Schleife, die mit jeder Zeile arbeitet (diese Schleife würde dann niemals enden).

Wie gesagt, hatte ich schon gedacht erst in eine Datei zu schreiben und eben diese auszulesen. Aber schön ist das nicht.

Habt ihr noch eine Idee?
Vielleicht ist stdbuf ja der richtige Weg und ich habe es nur nicht verstanden?!
 
Hi,

das grundsätzliche Problem mit dem 4K Puffer ist, dass das Programm hinter der Pipe erst etwas bekommt, wenn:
a) Programm vor der Pipe beendet
b) Puffer voll
c) Programm vor der Pipe macht ein flush()

Vom Aufbau des Programms nach der Pipe nehme ich mal an, dass dieses in einer Schleife von stdin liest, bis halt keine Daten mehr kommen.
Vom groben Ablauf her blockiert das read in dem zweiten Programm ja so lange, bis irgendwelche Daten kommen oder die Pipe geschlossen wird.

Wenn du nun einen Puffer von einer Zeile einstellst, dann wird diese gleich an das andere Programm übergeben, dort per read() gelesen und weiter verarbeitet. Dann läuft die Schleife dort weiter und er wartet wieder bis eine neue Zeile kommt.

Hoffe ich habs etwas verständlicher ausgedrückt jetzt :)

Grüße,
BK
 
Ich komme leider nicht zum Ziel.
Mein letzter der zig Versuche sieht nun wie folgt aus:
Code:
stdbuf -i0 -o0 -e0 sudo hcitool lescan | \
while read line
do
  echo "Line:" $line
done
Die Zeilen werden nicht ausgegeben.
Das Script endet aber auch nicht. Ich muss aber zwei mal CTRL+C ausführen, um das Script zu beenden. Der hcitool-Befehl scheint also zu laufen.
Nur, wie komme ich an die Zeilen, die es zurückgibt? :confused:
 
-oL -eL habe ich ausprobiert. Leider erhalte ich keine Ausgabe. Das Script sieht aktuell so aus:

Code:
stdbuf -i0 -o0 -e0 -oL -eL sudo hcitool lescan | \
#sudo hcitool lescan | \
while read line
do
  echo "Line:" $line
done
 
Hi,

also bei mir funktioniert ein Testscript (habe leider kein hcitool / bluetooth:
Bash:
#!/bin/bash -e

stdbuf -o0 -e0 -oL -eL seq 100 110 | \
while read line; do
  echo "Line: ${line}"
  sleep 1
done

Ausgabe (eine Zeile / Sekunde):
Code:
Line: 100
Line: 101
Line: 102
Line: 103
Line: 104
Line: 105
Line: 106
Line: 107
Line: 108
Line: 109
Line: 110

Schreibe mal das sudo vor das stdbuf, könnte sein dass das im Aufruf später Probleme macht:
Bash:
sudo stdbuf -oL -eL hcitool lescan

// Edit: stdbuf arbeitet mit LD_PRELOAD, von daher dürfte es dann Probleme mit dem später angegebenen sudo geben, weil das Programm setuid ist. Quelle: stdbuf Source

Grüße,
BK
 
Zuletzt bearbeitet:
Zurück