crontabスクリプトで `systemctl hibernate`は実行されません。

crontabスクリプトで `systemctl hibernate`は実行されません。

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

関連情報