使用 systemd 计时器而不是 cron

71G*_*1GA 10 linux arch-linux systemd systemd-timer

我在 Arch Linux 上,我正在尝试创建一个 systemd 计时器作为 cron 替代方案,用于在电池电量不足的情况下休眠我的笔记本电脑。所以我写了这三个文件:

/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
Run Code Online (Sandbox Code Playgroud)

/etc/systemd/system/battery.timer

[Unit]
Description=Periodical checking of battery status every two minutes

[Timer]
OnUnitActiveSec=2min 

[Install]
WantedBy=timers.target
Run Code Online (Sandbox Code Playgroud)

/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                                                                                                                
)    
Run Code Online (Sandbox Code Playgroud)

然后启用计时器我执行:

sudo systemctl enable battery.timer
sudo systemctl start battery.timer
Run Code Online (Sandbox Code Playgroud)

不知何故它不起作用。脚本自行工作。这意味着如果我执行下面的命令,我的计算机休眠就好了。

/home/ziga/Dropbox/workspace/operacijski/archlinux/hibernate/hibernatescript
Run Code Online (Sandbox Code Playgroud)

添加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
Run Code Online (Sandbox Code Playgroud)

[ziga@ziga-laptop ~]$ systemctl | grep battery
battery.timer  loaded active elapsed   Periodical checking of battery status every two minutes
Run Code Online (Sandbox Code Playgroud)

添加2:

应用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
Run Code Online (Sandbox Code Playgroud)

71G*_*1GA 7

这个问题的答案是在/etc/systemd/system/battery.service 中User=nobody不是与交换。不知何故,即使用户拥有使用命令的所有权限,它也无法在 bash 脚本内执行。我真的不知道为什么会发生这种情况。所以工作文件如下:User=zigaUser=rootzigasudosystemctl 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
Run Code Online (Sandbox Code Playgroud)

/etc/systemd/system/battery.timer

[Unit]
Description=Periodical checking of battery status every two minutes

[Timer]
OnBootSec=2min
OnUnitActiveSec=2min 

[Install]
WantedBy=battery.service
Run Code Online (Sandbox Code Playgroud)

/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
)
Run Code Online (Sandbox Code Playgroud)

我试过了,它也适用于User=zigaorUser=nobody但我们需要在最后一个脚本中更改/usr/bin/systemctl hibernatesudo /usr/bin/systemctl hibernate。所以它看起来User变量不知何故甚至无关紧要......哦,你也可以从最后一个脚本中删除绝对名称并将第一行从 更改#!/bin/sh#!/bin/bash。我也改变了WantedBy=timers.targetWantedBy=battery.service/etc/systemd/system/battery.timer

你去吧。在低电量情况下休眠笔记本电脑的最佳 cron 替代品。=)