Ich versuche, ein Bash-Skript zu schreiben, das btmon nach Geräteverbindungen abfragt. Ich habe eine funktionierende Lösung, aber sie ist absurd langsam, und es scheint, als ob das Problem darin besteht, dass grep nach der Suche nach einer Übereinstimmung nur sehr langsam beendet wird (ungefähr 25 Sekunden). Was kann ich tun, grep
um die Nutzung zu beschleunigen oder ganz zu vermeiden?
#!/bin/bash
COUNTER=0
while :
do
until btmon | grep -m 1 '@ Device Connected'
do :
done
let COUNTER=COUNTER+1
echo on 0 | cec-client RPI -s -d 1
sleep 5
echo as | cec-client RPI -s -d 1
until btmon | grep -m 1 '@ Device Disconnected'
do :
done
let COUNTER=COUNTER-1
if [ $COUNTER -eq 0 ];
then echo standby 0 | cec-client RPI -s -d 1;
fi
done
Bearbeiten: Zur Verdeutlichung: Es btmon
handelt sich um ein Bluetooth-Überwachungstool, das Teil der Bluez-Suite ist, und cec-client ist ein mit libCEC gepacktes Dienstprogramm, mit dem Befehle (unter anderem) über den seriellen HDMI-CEC-Bus ausgegeben werden können.
btmon
ausgegeben? Sind Sie sicher, dass es nicht nur um das Puffern geht?btmon
Geräte selbst puffern, in welchem Fall Sie kein Glück haben.Antworten:
Im:
Die meisten Shells (die Bourne-Shell (t) csh sowie yash und einige Versionen von AT & T ksh, die unter bestimmten Bedingungen die bemerkenswerten Ausnahmen darstellen) warten auf beide
cmd1
undcmd2
.In
bash
wirst du das bemerkenkehrt nach einer Sekunde zurück.
Im:
grep
wird beendet, sobald es ein Vorkommen des Musters gefunden hat,bash
wartet aber nochbtmon
.btmon
stirbt normalerweise an einem Sigpipegrep
, wenn es das nächste Mal in die Pipe schreibt, nachdem es zurückgekehrt ist. Wenn es jedoch nie wieder etwas schreibt, wird es dieses Signal niemals empfangen.Sie könnten ersetzen
#! /bin/bash
durch,#! /bin/ksh93
da dies eine Shell ist, die mit kompatibel ist,bash
und eine, die nur auf die letzte Komponente einer Pipeline wartet. Dann innach
grep
rückkehr,btmon
es im Hintergrund ausgeführt, und die Shell setzt den Rest des Skripts fort.Wenn Sie POSIXly
btmon
sofort nach dergrep
Rückkehr töten möchten, können Sie Folgendes tun:quelle