Estou tentando escrever um script bash que pesquisa btmon para conexões de dispositivos. Eu tenho uma solução funcional, mas é absurdamente lenta, e parece que o problema é grep, sendo muito lento para sair depois de encontrar uma correspondência (cerca de 25 segundos). O que posso fazer para acelerar grep
ou evitar o uso 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 esclarecer, btmon
e é uma ferramenta de monitoramento bluetooth que faz parte do pacote Bluez, e cec-client é um utilitário que acompanha o libCEC para emitir comandos através do barramento serial HDMI-CEC (entre outras coisas).
btmon
? Tem certeza de que não é apenas uma questão de buffer?btmon
implementos sejam armazenados em buffer; nesse caso, você está sem sorte.Respostas:
Em:
A maioria dos shells (o shell Bourne, (t) csh, assim como o yash e algumas versões do AT&T ksh sob algumas condições, sendo as notáveis exceções) esperam por ambos
cmd1
ecmd2
.Em
bash
, você notará queretorna após um segundo.
Em:
grep
sairá assim que encontrar uma ocorrência do padrão, masbash
ainda esperarábtmon
.btmon
normalmente morrerá de um SIGPIPE na próxima vez que gravar no canal apósgrep
retornar, mas se ele nunca gravar nada novamente, nunca receberá esse sinal.Você poderia substituir
#! /bin/bash
com#! /bin/ksh93
como isso é uma shell compatível combash
e uma que só aguarda o último componente de um pipeline. Então emapós
grep
retornos,btmon
seria executado em segundo plano e o shell continuaria com o restante do script.Se você quiser matar
btmon
assim quegrep
retornar, POSIXly, você pode fazer algo como:fonte