장치 연결을 위해 btmon을 폴링하는 bash 스크립트를 작성하려고 합니다. 작동하는 솔루션이 있지만 터무니없이 느리고 일치하는 항목을 찾은 후(약 25초) grep을 종료하는 데 매우 느린 문제인 것 같습니다. 속도를 grep
높이거나 완전히 사용하지 않으려면 어떻게 해야 합니까 ?
#!/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
편집: 명확히 하기 위해 btmon
Bluez 제품군의 일부인 블루투스 모니터링 도구이며 cec-client는 HDMI-CEC 직렬 버스를 통해 명령을 실행하기 위해 libCEC와 함께 패키지된 유틸리티입니다.
답변1
안에:
cmd1 | cmd2
대부분의 셸(Bourne 셸, (t)csh, yash 및 특정 조건에서 주목할 만한 예외인 일부 AT&T ksh 버전)은 cmd1
및 cmd2
.
에서는 bash
다음을 알 수 있습니다.
sleep 1 | uname
1초 후에 반환됩니다.
안에:
btmon | grep -m 1 '@ Device Disconnected'
grep
패턴이 한 번 발견되자마자 종료되지만 bash
여전히 기다립니다 btmon
.
btmon
일반적으로 반환된 후 파이프에 쓸 때 SIGPIPE가 종료되지만 grep
, 다시 아무것도 쓰지 않으면 해당 신호를 받을 수 없습니다.
와 호환되는 셸 이고 파이프라인의 마지막 구성 요소만 기다리는 셸이므로 #! /bin/bash
으로 대체할 수 있습니다 . 그런 다음#! /bin/ksh93 -
bash
btmon | grep -m 1 '@ Device Disconnected'
grep
반환 후에 btmon
는 백그라운드에서 계속 실행되고 쉘은 나머지 스크립트를 계속 수행합니다.
btmon
POSIXly에서 반환되는 즉시 종료하려면 grep
다음과 같이 할 수 있습니다.
sh -c 'echo "$$"; exec btmon' | (
read pid
grep -m1 '@ Device Disconnected' || exit
kill "$pid" 2> /dev/null
true)