cron 대신 systemd 타이머를 사용하세요

cron 대신 systemd 타이머를 사용하세요

배터리가 부족할 때 랩톱을 최대 절전 모드로 전환하기 위해 cron 대신 Arch Linux에서 시스템 타이머를 만들려고 합니다. 그래서 저는 다음 세 가지 파일을 작성했습니다.

/etc/systemd/system/battery.service

[Unit]
Description=Preko skripte preveri stanje baterije in hibernira v kolikor je stanje prenizko

[Service]
Type=oneshot
ExecStart=/home/ziga/Dropbox/workspace/operacijski/archlinux/hibernate/hibernatescript
User=nobody
Group=systemd-journal

/etc/systemd/system/battery.timer

[Unit]
Description=Periodical checking of battery status every two minutes

[Timer]
OnUnitActiveSec=2min 

[Install]
WantedBy=timers.target

/home/ziga/Dropbox/workspace/operacijski/archlinux/hibernate/hibernatescript

#!/bin/sh
/usr/bin/acpi -b | /usr/bin/awk -F'[,:%]' '{print $2, $3}' | (
        read -r status capacity
        if [ "$status" = Discharging ] && [ "$capacity" -lt 50 ]; then
                /usr/bin/systemctl hibernate
        fi                                                                                                                
)    

그런 다음 타이머를 활성화하려면 다음을 실행했습니다.

sudo systemctl enable battery.timer
sudo systemctl start battery.timer

하지만 어떻게 든 작동하지 않습니다. 스크립트는 독립적으로 실행될 수 있습니다. 이는 아래 명령을 실행하면 컴퓨터가 정상적으로 최대 절전 모드로 전환된다는 의미입니다.

/home/ziga/Dropbox/workspace/operacijski/archlinux/hibernate/hibernatescript

1을 추가하세요:

타이머를 활성화하고 시작한 후 몇 가지 확인을 실행하여 얻은 결과는 다음과 같습니다.

[ziga@ziga-laptop ~]$ systemctl list-timers
NEXT                          LEFT       LAST                          PASSED    UNIT                         ACTIVATES
n/a                           n/a        n/a                           n/a       battery.timer                battery.serv
Tue 2016-06-28 00:00:00 CEST  42min left Mon 2016-06-27 00:01:54 CEST  23h ago   logrotate.timer              logrotate.se
Tue 2016-06-28 00:00:00 CEST  42min left Mon 2016-06-27 00:01:54 CEST  23h ago   shadow.timer                 shadow.servi
Tue 2016-06-28 00:00:00 CEST  42min left Mon 2016-06-27 00:01:54 CEST  23h ago   updatedb.timer               updatedb.ser
Tue 2016-06-28 22:53:58 CEST  23h left   Mon 2016-06-27 22:53:58 CEST  23min ago systemd-tmpfiles-clean.timer systemd-tmpf

그리고

[ziga@ziga-laptop ~]$ systemctl | grep battery
battery.timer  loaded active elapsed   Periodical checking of battery status every two minutes

2를 추가하세요:

솔루션을 적용한 후알렉산더 T내 타이머가 시작되지만(아래 코드 확인) 직접 실행하면 스크립트가 랩탑을 최대 절전 모드로 전환하지 않고 대신 최대 절전 모드로 전환합니다.

[ziga@ziga-laptop ~]$ systemctl list-timers
NEXT                          LEFT          LAST                          PASSED       UNIT                         ACTIVATES
Tue 2016-06-28 19:17:30 CEST  1min 43s left Tue 2016-06-28 19:15:30 CEST  16s ago      battery.timer                battery.service

답변1

이 질문에 대한 답은 User=nobody교환이 아니라 교환 User=ziga 으로 입니다.User=root/etc/systemd/system/battery.service. 어쨌든 사용자가 ziga명령을 사용할 수 있는 모든 권한을 가지고 있더라도 bash 스크립트 내에서는 실행할 sudo수 없습니다 . systemctl hibernate왜 이런 일이 발생하는지 모르겠습니다. 따라서 작업 문서는 다음과 같습니다.

/etc/systemd/system/battery.service

[Unit]
Description=Preko skripte preveri stanje baterije in hibernira v kolikor je stanje prenizko

[Service]
Type=oneshot
ExecStart=/home/ziga/Dropbox/workspace/operacijski/archlinux/hibernate/hibernatescript
User=root
Group=systemd-journal

/etc/systemd/system/battery.timer

[Unit]
Description=Periodical checking of battery status every two minutes

[Timer]
OnBootSec=2min
OnUnitActiveSec=2min 

[Install]
WantedBy=battery.service

/home/ziga/Dropbox/workspace/operacijski/archlinux/hibernate/hibernatescript

#!/bin/sh
/usr/bin/acpi -b | /usr/bin/awk -F'[,:%]' '{print $2, $3}' | (
        read -r status capacity
        if [ "$status" = Discharging ] && [ "$capacity" -lt 7 ]; then
                /usr/bin/systemctl hibernate
        fi
)

시도해 보았는데 User=zigaor 와도 잘 작동 User=nobody하지만 마지막 스크립트에서 로 변경해야 합니다 /usr/bin/systemctl hibernate. 그러면 변수는 아무래도 상관 없을 것 sudo /usr/bin/systemctl hibernate같은데 ... 아, 마지막 스크립트에서 절대 이름을 제거하고 첫 번째 줄을 에서 로 변경할 수도 있습니다 . 나도 로 바꿨다User#!/bin/sh#!/bin/bashWantedBy=timers.targetWantedBy=battery.service/etc/systemd/system/battery.timer.

그러면 그렇게 해. 배터리 부족 최대 절전 모드 노트북을 위한 최고의 cron 대안입니다. =)

답변2

부팅 후 첫 번째 부팅을 다음과 같이 추가해 보아야 할 수도 있습니다.

[Timer] OnBootSec=15min OnUnitActiveSec=2m

관련 정보