バッテリーが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は手動で起動するときとは異なる方法でスクリプトを起動しますか?では、どのようにこのようなことがあるのでしょうか。