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

관련 정보