Estoy tratando de escribir un script bash que sondee btmon para las conexiones del dispositivo. Tengo una solución que funciona, pero es absurdamente lenta, y parece que el problema es que grep es muy lento para salir después de encontrar una coincidencia (alrededor de 25 segundos). ¿Qué puedo hacer para acelerar grep
o evitar usarlo por completo?
#!/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
editar: para aclarar, btmon
y es una herramienta de monitoreo de bluetooth que es parte de la suite Bluez, y cec-client es una utilidad que está empaquetada con libCEC para emitir comandos a través del bus serie HDMI-CEC (entre otras cosas).
btmon
? ¿estás seguro de que no es solo una cuestión de almacenamiento en búfer?btmon
implementa el almacenamiento en búfer, en cuyo caso no tiene suerte.Respuestas:
En:
La mayoría de los shells (el shell Bourne, (t) csh, así como el yash y algunas versiones de AT&T ksh en algunas condiciones son las excepciones notables) esperan ambos
cmd1
ycmd2
.En
bash
, notarás queregresa después de un segundo.
En:
grep
saldrá tan pronto como haya encontrado una aparición del patrón, perobash
aún esperarábtmon
.btmon
normalmente morirá de un SIGPIPE la próxima vez que escriba en la tubería después degrep
haya regresado, pero si nunca vuelve a escribir nada, nunca recibirá esa señal.Se podría sustituir a
#! /bin/bash
la#! /bin/ksh93
ya que es una cáscara compatible conbash
y que sólo espera a que el último componente de un oleoducto. Entonces endespués
grep
retornos,btmon
se dejaría ejecutándose en segundo plano y el shell continuaría con el resto del script.Si quisieras matar
btmon
tan pronto comogrep
regrese, POSIXly, podrías hacer algo como:fuente