バッテリーが不足しているときにラップトップを休止状態にするために、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=ziga
orでもうまく機能しますUser=nobody
が、最後のスクリプトでに変更する必要があります/usr/bin/systemctl hibernate
。その後、変数はどうしても構いませんsudo /usr/bin/systemctl hibernate
。私も変わったUser
#!/bin/sh
#!/bin/bash
WantedBy=timers.target
WantedBy=battery.service
/etc/systemd/system/battery.timer。
それではそうします。バッテリー不足休止状態ノートパソコンのための最高のcronの代替品です。 =)
答え2
起動後、最初の起動を次のように追加する必要があります。
[Timer] OnBootSec=15min OnUnitActiveSec=2m