バッテリー残量を確認し、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リソースが多用されていることをイメージで見ることができます。削除されません。
単純な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
さまざまなシステムにインストールされているすべてのシェルがそれをサポートしているわけではありません。)