usando temporizadores systemd em vez de cron

6

Estou no Arch Linux, onde estou tentando criar um temporizador systemd como uma alternativa cron para hibernar meu laptop com bateria fraca. Então eu escrevi esses três arquivos:

/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 / espaço de trabalho / 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                                                                                                                
)    

E, em seguida, para ativar o timer, executei:

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

E de alguma forma não está funcionando. O script funciona sozinho. Isso significa que se eu executar o comando abaixo, o meu computador hiberna muito bem.

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

ADD1:

Depois de ativar e iniciar o cronômetro, fiz algumas verificações e é isso que recebo:

[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

e

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

ADD2:

Depois de aplicar a solução do Alexander T , o timer começa (verifique o código abaixo), mas o script não hiberna meu laptop enquanto ele hiberna se eu o executar diretamente.

[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
    
por 71GA 27.06.2016 / 22:26

2 respostas

4

Uma resposta a essa pergunta é trocar User=nobody não por User=ziga , mas com User=root em /etc/systemd/system/battery.service . De alguma forma, mesmo se o usuário ziga tiver todos os privilégios de usar o comando sudo , ele não poderá executar systemctl hibernate dentro do script bash. Eu realmente não sei porque isso acontece. Portanto, os arquivos de trabalho são os seguintes:

/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 / espaço de trabalho / 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
)

Eu tentei e também funciona com User=ziga ou User=nobody , mas precisamos alterar /usr/bin/systemctl hibernate em sudo /usr/bin/systemctl hibernate no último script. Então, parece que a variável User de alguma forma nem importa ... Ah, e você também pode remover nomes absolutos do último script e alterar a primeira linha de #!/bin/sh para #!/bin/bash . Eu também alterei WantedBy=timers.target para WantedBy=battery.service em /etc/systemd/system/battery.timer .

Lá vai você. A melhor alternativa cron para hibernar laptops com bateria fraca. =)

    
por 28.06.2016 / 20:51
2

Pode ser que você tente adicionar o primeiro início após o boot, assim:

[Timer] OnBootSec=15min OnUnitActiveSec=2m

    
por 27.06.2016 / 23:48