배터리가 부족할 때 랩톱을 최대 절전 모드로 전환하기 위해 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=ziga
or 와도 잘 작동 User=nobody
하지만 마지막 스크립트에서 로 변경해야 합니다 /usr/bin/systemctl hibernate
. 그러면 변수는 아무래도 상관 없을 것 sudo /usr/bin/systemctl hibernate
같은데 ... 아, 마지막 스크립트에서 절대 이름을 제거하고 첫 번째 줄을 에서 로 변경할 수도 있습니다 . 나도 로 바꿨다User
#!/bin/sh
#!/bin/bash
WantedBy=timers.target
WantedBy=battery.service
/etc/systemd/system/battery.timer.
그러면 그렇게 해. 배터리 부족 최대 절전 모드 노트북을 위한 최고의 cron 대안입니다. =)
답변2
부팅 후 첫 번째 부팅을 다음과 같이 추가해 보아야 할 수도 있습니다.
[Timer] OnBootSec=15min OnUnitActiveSec=2m