web-dev-qa-db-ja.com

cronの代わりにsystemdタイマーを使用する

私はArch Linuxを使用しています。低バッテリーでラップトップを休止状態にするためのcronの代替としてsystemdタイマーを作成しようとしています。だから私はこれらの3つのファイルを書きました:

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

そして、タイマーを有効にするために私は実行しました:

Sudo systemctl enable battery.timer
Sudo systemctl start battery.timer

そして、どういうわけかそれは機能していません。スクリプトはそれ自体で動作します。これは、以下のコマンドを実行すると、コンピュータが正常に休止状態になることを意味します。

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

ADD1:

タイマーを有効にして開始した後、いくつかのチェックを実行しました。

[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

そして

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

ADD2:

Alexander Tからソリューションを適用した後、タイマーが開始します(以下のコードを確認してください)が、直接実行すると、スクリプトがラップトップを休止状態にしません。

[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
9
71GA

この質問への答えは、User=nobodyUser=zigaではなくUser=rootと交換することです/ etc/systemd/system/battery.serviceで。どういうわけか、ユーザーzigaSudoコマンドを使用するすべての特権を持っている場合でも、bashスクリプト内でsystemctl hibernateを実行することはできません。なぜこれが起こるのか本当にわかりません。したがって、作業ファイルは次のとおりです。

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

私は試してみましたが、すべてUser=zigaまたはUser=nobodyでも機能しますが、最後のスクリプトで/usr/bin/systemctl hibernateSudo /usr/bin/systemctl hibernateに変更する必要があります。したがって、User変数はどうやら問題ではないようです...ああ、最後のスクリプトから絶対名を削除して、最初の行を#!/bin/shから#!/bin/bashに変更することもできます。 / etc/systemd/system/battery.timerWantedBy=timers.targetWantedBy=battery.serviceに変更しました。

どうぞ。低バッテリで休止状態のラップトップに代わる最高のcron代替品。 =)

6
71GA

次のように、起動後に最初の起動を追加する必要があるかもしれません:

[Timer] OnBootSec=15min OnUnitActiveSec=2m

2