在 Bash 中睡眠 if/else 睡眠 vs&& 睡眠占用CPU

在 Bash 中睡眠 if/else 睡眠 vs&& 睡眠占用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为什么会上升吗? notify命令和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调用成功时,您才会休眠;但如果测试是假的则不然。在第二个版本中,您只在测试为假的分支中睡觉,并且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各种系统中安装的所有 shell 都支持它。)

相关内容