私は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
この質問への答えは、User=nobody
をUser=ziga
ではなくUser=root
と交換することです/ etc/systemd/system/battery.serviceで。どういうわけか、ユーザーziga
がSudo
コマンドを使用するすべての特権を持っている場合でも、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 hibernate
をSudo /usr/bin/systemctl hibernate
に変更する必要があります。したがって、User
変数はどうやら問題ではないようです...ああ、最後のスクリプトから絶対名を削除して、最初の行を#!/bin/sh
から#!/bin/bash
に変更することもできます。 / etc/systemd/system/battery.timerでWantedBy=timers.target
をWantedBy=battery.service
に変更しました。
どうぞ。低バッテリで休止状態のラップトップに代わる最高のcron代替品。 =)
次のように、起動後に最初の起動を追加する必要があるかもしれません:
[Timer] OnBootSec=15min OnUnitActiveSec=2m