장치 연결을 위해 btmon을 폴링하는 bash 스크립트를 작성하려고 합니다. 작동하는 솔루션이 있지만 터무니없이 느리고 문제는 일치하는 항목을 찾은 후 grep이 매우 느리게(~25초) 종료되는 것 같습니다. 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
cec-client는 Bluez 제품군의 일부인 Bluetooth 모니터링 도구이고 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
grep
반환 후 일반적으로 다음에 파이프에 쓸 때 SIGPIPE로 인해 종료되지만 더 이상 아무것도 쓰지 않으면 해당 신호를 수신하지 않습니다.
호환되는 쉘이기 때문에 #! /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)