Próbuję napisać skrypt bash, który odpytuje btmon w poszukiwaniu połączeń urządzeń. Mam działające rozwiązanie, ale jest absurdalnie wolne i wydaje się, że problem polega na tym, że grep bardzo powoli wychodzi z gry po znalezieniu dopasowania (około 25 sekund). Co mogę zrobić, aby przyspieszyć grep
lub całkowicie go nie używać?
#!/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
edycja: Aby to wyjaśnić, btmon
jest narzędziem do monitorowania Bluetooth, które jest częścią pakietu Bluez, a cec-client jest narzędziem, które jest spakowane z libCEC do wydawania poleceń przez magistralę szeregową HDMI-CEC (między innymi).
btmon
? czy jesteś pewien, że nie chodzi tylko o buforowanie?btmon
samo buforuje, w którym to przypadku nie masz szczęścia.Odpowiedzi:
W:
Większość pocisków (powłoka Bourne'a, (t) csh, a także yash i niektóre wersje AT&T ksh, pod pewnymi warunkami będącymi godnymi uwagi wyjątkami) czekają na oba
cmd1
icmd2
.W
bash
, można zauważyć, żewraca po jednej sekundzie.
W:
grep
wyjdzie, gdy tylko znajdzie jedno wystąpienie wzorca, alebash
nadal będzie czekaćbtmon
.btmon
zazwyczaj umiera z SIGPIPE następnym razem, gdy pisze do potoku pogrep
powrocie, ale jeśli już nigdy więcej nie napisze, nigdy nie otrzyma tego sygnału.Można wymienić
#! /bin/bash
z#! /bin/ksh93
jak to jest kompatybilne z muszlibash
i jeden, który czeka tylko na ostatni składnik rurociągu. Następnie wpo
grep
powrociebtmon
pozostawałby uruchomiony w tle, a powłoka kontynuowałaby resztę skryptu.Jeśli chcesz zabić,
btmon
gdy tylkogrep
wróci, POSIXly, możesz zrobić coś takiego:źródło