Une réponse à cette question est d'échanger User=nobody
pas avec User=ziga
mais avec User=root
dans /etc/systemd/system/battery.service . D'une manière ou d'une autre, même si l'utilisateur ziga
a tous les privilèges d'utiliser sudo
commande qu'il ne peut pas exécuter systemctl hibernate
à l'intérieur du script bash. Je ne sais vraiment pas pourquoi cela arrive. Les fichiers de travail sont donc les suivants :
/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
)
Je l'ai essayé et ça marche aussi avec User=ziga
ou User=nobody
mais nous devons changer /usr/bin/systemctl hibernate
en sudo /usr/bin/systemctl hibernate
dans le dernier scénario. Il ressemble donc à User
la variable n'a même pas d'importance... Oh et vous pouvez aussi supprimer les noms absolus du dernier script et changer la première ligne de #!/bin/sh
à #!/bin/bash
. J'ai aussi changé WantedBy=timers.target
à WantedBy=battery.service
dans /etc/systemd/system/battery.timer .
Voilà. La meilleure alternative cron pour hiberner les ordinateurs portables sur batterie faible. =)
Peut-être devriez-vous essayer d'ajouter le premier démarrage après le démarrage, comme ceci :
[Timer]
OnBootSec=15min
OnUnitActiveSec=2m