Una respuesta a esta pregunta es intercambiar User=nobody
no con User=ziga
pero con User=root
en /etc/systemd/system/battery.service . De alguna manera, incluso si el usuario ziga
tiene todos los privilegios de usar sudo
comando que no puede ejecutar systemctl hibernate
dentro del script bash. Realmente no sé por qué sucede esto. Así que los archivos de trabajo son los siguientes:
/etc/systemd/system/battery.servicio
[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
)
Lo probé y también funciona con User=ziga
o User=nobody
pero necesitamos cambiar /usr/bin/systemctl hibernate
en sudo /usr/bin/systemctl hibernate
en el último guión. Entonces parece User
la variable de alguna manera ni siquiera importa... Ah, y también puede eliminar los nombres absolutos del último script y cambiar la primera línea de #!/bin/sh
a #!/bin/bash
. También cambié WantedBy=timers.target
a WantedBy=battery.service
en /etc/systemd/system/battery.timer .
Ahí tienes La mejor alternativa de cron para hibernar portátiles con poca batería. =)
Puede ser que deba intentar agregar el primer inicio después del arranque, así:
[Timer]
OnBootSec=15min
OnUnitActiveSec=2m