Bash Sleep과 Bash에서 if/else를 자고 있습니다.&& 수면은 CPU를 차지합니다

Bash Sleep과 Bash에서 if/else를 자고 있습니다.&& 수면은 CPU를 차지합니다

배터리 잔량을 확인하고 5% 미만이면 사용자에게 알리는 스크립트를 작성했습니다.

스크립트는 각 검사 후 1분 동안 휴면 상태로 유지됩니다.

다음과 같이 스크립트를 작성하면 CPU 작업 부하가 크게 증가합니다.

#!/bin/sh

while true; do
  [[
    $(
      upower -i /org/freedesktop/UPower/devices/battery_BAT0 |
      grep percentage |
      grep -Poe  "\d*"
    ) -lt 5
  ]] &&
  notify-send "Battery below 5%" &&
  sleep 60
done

CPU가 왜 올라가는지 아시나요? inform 명령 및 upower 명령은 CPU 리소스를 해제하지 않습니다.

CPU 자원이 많이 사용되고 있는 것을 이미지에서 볼 수 있습니다. 삭제되지 않습니다.

간단한 if/else 블록을 사용하여 보다 전통적인 방식으로 스크립트를 작성하면 모든 것이 예상대로 작동하고 CPU는 절전 기간이 끝난 후 시작 부분에만 잠깐 동안만 증가합니다.

while true; do
  if [[ 
      $(
        upower -i /org/freedesktop/UPower/devices/battery_BAT0 |
        grep percentage |
        grep -Poe  "\d*"
      ) -lt 5
     ]]; then
    notify-send "Battery below 5%"
  else
    sleep 60
  fi
done

왜 이런 동작이 발생하는지 아시나요?

답변1

첫 번째 버전에서는 notify-send테스트가 참이고 호출이 성공한 경우에만 잠을 자고 테스트가 거짓인 경우에는 잠을 자지 않았습니다. 두 번째 버전에서는 테스트가 false인 지점에서만 잠을 자고 있습니다 notify-send.아니요부르다. 이는 후자 버전의 배터리가 부족해지면 동일한 문제에 직면하게 된다는 것을 의미합니다.

테스트 결과에 관계없이 두 경우 모두 스크립트를 절전 모드로 전환해야 합니다. 최소한 첫 번째 버전에서는 after를 변경하여 &&두 명령 간의 관계를 끊습니다. 그러나 나는 - 문을 다음과 같이 철자하겠습니다.notify-send;if

#!/bin/sh
while true; do
  pct=$(
        upower -i /org/freedesktop/UPower/devices/battery_BAT0 |
        grep percentage |
        grep -Poe  "\d*"
      )
  if [ "$pct" -lt 5 ]; then
    notify-send "Battery below 5%"
  fi
  sleep 60
done

( [[ .. ]]조건부는 표준 기능이 아니며 sh다양한 시스템에 설치된 모든 쉘이 이를 지원하는 것은 아닙니다.)

관련 정보