using systemd timers instead of cron
An answer to this question is to swap User=nobody
not with User=ziga
but with User=root
in /etc/systemd/system/battery.service. Somehow even if user ziga
has all the privileges of using sudo
command it can't execute systemctl hibernate
inside of the bash script. I really don't know why this happens. So the working files are as follows:
/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
)
I tried it and it allso works with User=ziga
or User=nobody
but we need to change /usr/bin/systemctl hibernate
into sudo /usr/bin/systemctl hibernate
in the last script. So it looks like User
variable somehow doesn't even matter... Oh and you can as well remove absolute names from the last script and change first line from #!/bin/sh
to #!/bin/bash
. I also changed WantedBy=timers.target
to WantedBy=battery.service
in /etc/systemd/system/battery.timer.
There you go. The best cron alternative to hibernate laptops on low battery. =)
May be you shoul try to add first start after boot, like this:
[Timer]
OnBootSec=15min
OnUnitActiveSec=2m