cronの代わりにsystemdタイマーを使用してください

cronの代わりにsystemdタイマーを使用してください

バッテリーが不足しているときにラップトップを休止状態にするために、cronの代わりにArch Linuxでシステムタイマーを作成しようとしています。だから私は次の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

1を追加:

タイマーを有効にして起動した後、いくつかの確認を実行した結果は次のとおりです。

[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

2を追加します。

ソリューションを適用した後アレクサンダー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

答え1

この質問に対する答えはUser=nobody交換ではなく交換User=ziga です。User=root/etc/systemd/system/battery.service。とにかく、ユーザーがzigaコマンドを使用するためのすべての権限を持っていても、bashスクリプト内では実行sudoできません。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=zigaorでもうまく機能しますUser=nobodyが、最後のスクリプトでに変更する必要があります/usr/bin/systemctl hibernate。その後、変数はどうしても構いませんsudo /usr/bin/systemctl hibernate。私も変わったUser#!/bin/sh#!/bin/bashWantedBy=timers.targetWantedBy=battery.service/etc/systemd/system/battery.timer

それではそうします。バッテリー不足休止状態ノートパソコンのための最高のcronの代替品です。 =)

答え2

起動後、最初の起動を次のように追加する必要があります。

[Timer] OnBootSec=15min OnUnitActiveSec=2m

関連情報