acpiを使用してバッテリーレベルを確認するスクリプトがありますが、バッテリーレベルが特定のしきい値より低い場合は、コンピュータをロックして休止状態にする必要があります。 crontabを使用して毎分スクリプトを実行します。
問題は、マシンがロックされているが決して眠らないことです。
スクリプト:
#!/bin/sh
acpi -b | awk -F'[,:%]' '{print $2, $3}' | {
read -r status capacity
if [ "$status" = Discharging -a "$capacity" -lt 10 ]; then
echo 'Success' >> /tmp/low;
logger "Critical battery threshold";
DISPLAY=:0 i3lock -t -i $(ls -d ~/.wallpapers/* | shuf | head -n 1);
echo 'Locked' >> /tmp/low;
systemctl hibernate;
fi
}
ログ/tmp/low
ファイルには以下が表示されます。
$ cat /tmp/low
Success
Locked
Success
Locked
Success
Locked
ACPIを確認せずに同様のスクリプトを直接実行してみましたが、正常に実行されました。
テストスクリプト:
#!/bin/sh
acpi -b | awk -F'[,:%]' '{print $2, $3}' | {
read -r status capacity
echo 'Success' >> /tmp/low;
logger "Critical battery threshold";
DISPLAY=:0 i3lock -t -i $(ls -d ~/.wallpapers/* | shuf | head -n 1);
echo 'Locked' >> /tmp/low;
systemctl hibernate;
}
同じテストスクリプトを実行するために使用されましたが、at
システムを休止状態にしませんでした。 crontabが実行されていない理由のアイデアはありますかsystemctl hibernate
?
答え1
解決策が見つかりました。明らかに、問題はpolkit
シャットダウン、再起動、一時停止、休止状態などのユーザーポリシーを定義するパッケージにあります。
デフォルトでは、ルールファイルがないため、/etc/polkit-1/rules.d
ユーザーはログイン中にコンピュータを休止状態にするか一時停止することはできません。 (ここで問題は、休止状態の前にコンピュータをロックしたため、開いているセッションがあることです。)
/etc/polkit-1/rules.d/99-allow-hibernate-on-low-battery.rules
この問題を解決するには、次の内容を含むファイルを作成する必要がありました。
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.login1.suspend" ||
action.id == "org.freedesktop.login1.suspend-multiple-sessions" ||
action.id == "org.freedesktop.login1.hibernate" ||
action.id == "org.freedesktop.login1.hibernate-multiple-sessions") {
return polkit.Result.YES;
}
});
その後、本機が正しく休止状態になるcron
ことがあります。at