일치하는 항목을 찾은 후 Grep이 종료하는 데 속도가 느립니까?

일치하는 항목을 찾은 후 Grep이 종료하는 데 속도가 느립니까?

장치 연결을 위해 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

편집: 명확히 하기 위해 btmonBluez 제품군의 일부인 블루투스 모니터링 도구이며 cec-client는 HDMI-CEC 직렬 버스를 통해 명령을 실행하기 위해 libCEC와 함께 패키지된 유틸리티입니다.

답변1

안에:

cmd1 | cmd2

대부분의 셸(Bourne 셸, (t)csh, yash 및 특정 조건에서 주목할 만한 예외인 일부 AT&T ksh 버전)은 cmd1cmd2.

에서는 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는 백그라운드에서 계속 실행되고 쉘은 나머지 스크립트를 계속 수행합니다.

btmonPOSIXly에서 반환되는 즉시 종료하려면 grep다음과 같이 할 수 있습니다.

sh -c 'echo "$$"; exec btmon' | (
   read pid
   grep -m1 '@ Device Disconnected' || exit
   kill "$pid" 2> /dev/null
   true)

관련 정보