Udevは休止状態スクリプトを実行します。

Udevは休止状態スクリプトを実行します。

バッテリーが5%以下のときにスクリプトを起動するudevルールがあります。

$ cat /etc/udev/rules.d/90-lowbat.rules:

SUBSYSTEM=="power_supply", ATTR{status}=="Discharging", ATTR{capacity}=="5", RUN+="/opt/bin/battery-low.sh" 
SUBSYSTEM=="power_supply", ATTR{status}=="Discharging", ATTR{capacity}=="4", RUN+="/opt/bin/battery-low.sh"
SUBSYSTEM=="power_supply", ATTR{status}=="Discharging", ATTR{capacity}=="3", RUN+="/opt/bin/battery-low.sh"
SUBSYSTEM=="power_supply", ATTR{status}=="Discharging", ATTR{capacity}=="2", RUN+="/opt/bin/battery-low.sh"
SUBSYSTEM=="power_supply", ATTR{status}=="Discharging", ATTR{capacity}=="1", RUN+="/opt/bin/battery-low.sh"
SUBSYSTEM=="power_supply", ATTR{status}=="Discharging", ATTR{capacity}=="0", RUN+="/opt/bin/battery-low.sh"

スクリプトは次のとおりです。

$ cat /opt/bin/battery-low.sh:

#!/bin/bash
# Critical battery level (acpi reports it at 5%)
CRITICAL=5

battery_level=`acpi -b | grep -o [0-9]*% | sed s/%//`
if [ ! $battery_level ]
then
   exit
fi
if [ $battery_level -le $CRITICAL ]
then
   if acpi -a | grep 'off-line'
   then
      # First warning
      sudo -u andreas DISPLAY=":0.0" notify-send -u critical "GIMME POWER ... will shut down in 60 sec"
      sleep 60s
         if acpi -a | grep 'off-line'
         then
            # Second warning
            sudo -u andreas DISPLAY=":0.0" notify-send -u critical "... shutting down"
            sleep 2s
            # This is the path to systemctl in Debian
            /bin/systemctl hibernate
         fi
   fi
fi

バッテリーが5%以下の場合、スクリプトが実行され、最初の警告が表示されます。

ただし、スクリプトの最後の部分は実行されません。デバイスのプラグがまだ抜かれていたため、2番目の警告も表示されず、コンピュータも休止状態になりませんでした。

確かにスクリプトには多くの問題があるかもしれませんが、興味深いことに、スクリプトを実行するとsudo ./battery-low.sh(バッテリーが5%以下でコンピュータのプラグが抜けている場合)、すべてがうまく機能します。警告が2回表示され、コンピュータは1時間スリープモードに入ります。約62秒前。

udevは手動で起動するときとは異なる方法でスクリプトを起動しますか?では、どのようにこのようなことがあるのでしょうか。

関連情報