utilisant des temporisations systemd au lieu de cron

Je suis sur Arch Linux où j'essaye de créer un timer systemd comme une alternative cron pour hibernate mon ordinateur portable sur batterie faible. J'ai donc écrit ces trois files:

/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 / espace de travail / 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 ) 

Et puis pour activer la timer j'ai exécuté:

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

Et en quelque sorte ça ne marche pas. Script fonctionne de lui-même. Cela signifie que si j'exécute la command ci-dessous, mon ordinateur hiberne très bien.

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

ADD1:

Après l'activation et le démarrage de la timer j'ai fait quelques vérifications et c'est ce que j'ai obtenu:

 [ziga@ziga-laptop ~]$ systemctl list-timers NEXT LEFT LAST PASSED UNIT ACTIVATES n/an/an/an/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 

et

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

ADD2:

Après avoir appliqué la solution d' Alexander T, mon temporisateur démarre (vérifiez le code ci-dessous) mais le script n'hibive pas mon ordinateur portable pendant qu'il hiberne si je l'exécute directement.

 [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 

Une réponse à cette question est d'échanger User=nobody avec User=ziga mais avec User=root dans /etc/systemd/system/battery.service . D'une certaine façon, même si l'user ziga a tous les privilèges d'utiliser la command sudo il ne peut pas exécuter systemctl hibernate intérieur du script bash. Je ne sais vraiment pas pourquoi cela arrive. Les files 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 / espace de travail / 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 tout fonctionne avec User=ziga ou User=nobody mais nous devons changer /usr/bin/systemctl hibernate dans sudo /usr/bin/systemctl hibernate dans le dernier script. Il semble donc que la variable User n'implique même pas … Oh et vous pouvez aussi supprimer les noms absolus du dernier script et changer la première ligne de #!/bin/sh en #!/bin/bash . J'ai aussi changé WantedBy=timers.target à WantedBy=battery.service battery.service dans /etc/systemd/system/battery.timer .

Voilà. La meilleure alternative cron à hibernate les ordinateurs portables sur batterie faible. =)

Peut-être devriez-vous essayer d'append le premier démarrage après le démarrage, comme ceci:

[Timer] OnBootSec=15min OnUnitActiveSec=2m