일치하는 항목을 찾은 후 Grep이 천천히 종료됩니까?

일치하는 항목을 찾은 후 Grep이 천천히 종료됩니까?

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

편집: 명확히 하기 위해 btmoncec-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.

btmongrep반환 후 일반적으로 다음에 파이프에 쓸 때 SIGPIPE로 인해 종료되지만 더 이상 아무것도 쓰지 않으면 해당 신호를 수신하지 않습니다.

호환되는 쉘이기 때문에 #! /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)

관련 정보