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)
这个问题的答案是在/etc/systemd/system/battery.service 中 而User=nobody
不是与交换。不知何故,即使用户拥有使用命令的所有权限,它也无法在 bash 脚本内执行。我真的不知道为什么会发生这种情况。所以工作文件如下:User=ziga
User=root
ziga
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
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=ziga
orUser=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 替代品。=)
归档时间: |
|
查看次数: |
3558 次 |
最近记录: |