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テストが真で、呼び出しが成功した場合にのみ眠り、テストが偽の場合は眠りませんでした。 2番目のバージョンでは、テストがfalseの時点でのみ眠っていますnotify-sendいいえ呼ぶこれは、後者のバージョンのバッテリーが不足すると同じ問題に直面することを意味します。

テスト結果に関係なく、どちらの場合もスクリプトをスリープモードにする必要があります。少なくとも最初のバージョンでは、afterを変更して&&2つのコマンド間の関係を切断します。しかし、私は - ドアを次のように綴ります。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さまざまなシステムにインストールされているすべてのシェルがそれをサポートしているわけではありません。)

関連情報