Verwenden von Systemd-Timern anstelle von Cron

9

Ich arbeite unter Arch Linux und versuche, einen System-Timer als Alternative für den Ruhezustand meines Laptops bei schwachem Akku zu erstellen. Also habe ich diese drei Dateien geschrieben:

/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                                                                                                                
)    

Und dann, um den Timer zu aktivieren, habe ich ausgeführt:

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

Und irgendwie funktioniert es nicht. Das Skript funktioniert von selbst. Dies bedeutet, dass mein Computer in den Ruhezustand wechselt, wenn ich den folgenden Befehl ausführe.

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

ADD1:

Nachdem ich den Timer aktiviert und gestartet habe, habe ich einige Überprüfungen durchgeführt und Folgendes bekomme ich:

[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

und

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

ADD2:

Nach dem Anwenden der Lösung von Alexander T startet mein Timer (siehe Code unten), aber das Skript hält meinen Laptop nicht in den Ruhezustand, während es in den Ruhezustand versetzt wird, wenn ich ihn direkt ausführe.

[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
71GA
quelle
2
Ist es möglicherweise ein Berechtigungsproblem? Wenn Sie sagen, Sie haben es ausgeführt, war es als nobodyBenutzer oder als Ziga (ich verstehe /home/ziga)? Benutzer niemand hat möglicherweise nicht genügend Berechtigungen . Wenn Sie sagen, dass es nicht funktioniert , wie weit kommt es?
tniles
Ich habe versucht, den Benutzer zu ändern, zigaaber es funktioniert nicht.
71GA
Ich habe versucht WantedBy=timers.target, WantedBy=battery.servicein /etc/systemd/system/battery.timer zu wechseln , aber das macht nichts.
71GA

Antworten:

6

Eine Antwort auf diese Frage ist zu tauschen User=nobodynicht User=ziga aber mit User=rootin /etc/systemd/system/battery.service . Selbst wenn der Benutzer zigaüber alle Berechtigungen zur Verwendung eines sudoBefehls verfügt, kann er nicht systemctl hibernateinnerhalb des Bash-Skripts ausgeführt werden. Ich weiß wirklich nicht, warum das passiert. Die Arbeitsdateien lauten also wie folgt:

/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
)

Ich versuchte es und es allso Arbeiten mit User=zigaoder User=nobodyaber wir müssen Änderung /usr/bin/systemctl hibernatein sudo /usr/bin/systemctl hibernateim letzten Skript. Es sieht also so aus, als wäre eine UserVariable irgendwie egal ... Oh, und Sie können auch absolute Namen aus dem letzten Skript entfernen und die erste Zeile von #!/bin/shin ändern #!/bin/bash. Ich habe auch WantedBy=timers.targetzu WantedBy=battery.servicein /etc/systemd/system/battery.timer .

Los geht's. Die beste Alternative zu Laptops im Ruhezustand bei schwachem Akku. =)

71GA
quelle
2

Möglicherweise sollten Sie versuchen, den ersten Start nach dem Start wie folgt hinzuzufügen:

[Timer] OnBootSec=15min OnUnitActiveSec=2m

Alexander Tolkachev
quelle
@ 71GA, Ja, lies es dort. Ich denke, Thema Starter Problem verursacht durch das Fehlen des ersten Starts.
Alexander Tolkachev
Dies ändert einige Dinge. Bitte überprüfen Sie meine ADD2 auf die Frage.
71GA
Haben Sie versucht, / usr / bin / systemctl Hibernate nicht über das Skript aufzurufen? Funktioniert es? Denn wenn ich versuche, es in meinen Centos nicht vom Root-Konto zu tun, erhalte ich eine Fehlermeldung Authentication is required for hibernating the system.und fordere das Root-Passwort an. Vielleicht haben Sie das gleiche Problem und sollten es unter starten sudo?
Alexander Tolkachev
Mein Benutzer zigaist in der Gruppe usersund ich habe diese Regel %users ALL=(ALL) NOPASSWD: ALLin der Datei / etc / sudoers. Diese Regel ermöglicht es allen Benutzern aus der Gruppe users, sudoBefehle auszuführen, ohne ein Kennwort einzugeben . Der Benutzer zigasollte also in Ordnung sein, oder? Welche Art von Benutzer verwendet ein systemd-Dienst? Ich habe versucht , Einstellung User=nobodyund User=zigain /etc/systemd/system/battery.service aber nichts funktioniert.
71GA