通过脚本的方式设置一个service,github有一个现成的脚本。
作者使用了下面的设备进行测试,
Asus vivobook 15 with AMD Ryzen 3500U running Linux mint 20 Kernal 5.8.0-25-generic;
Asus Vivobook 15 PRO OLED Ryzen5900 M3500 using 5.3.1 artix-linux;
Asus TUF Gaming F15 using Debian 12;
我的环境是 天选Air2022 3050 Debian12。
使用
systemd用户下载,会创建服务,重启后也会生效
wget https://raw.githubusercontent.com/sreejithag/battery-charging-limiter-linux/refs/heads/main/limitd.sh
chmod +x limitd.sh
./limitd.sh 80
ying@192 ~/playground> ./limitd.sh 80
Max battery capacity is limiting to 80 % ✓
created battery-manager.service ✓
Created symlink /etc/systemd/system/multi-user.target.wants/battery-manager.service → /etc/systemd/system/battery-manager.service.
Created symlink /etc/systemd/system/suspend.target.wants/battery-manager.service → /etc/systemd/system/battery-manager.service.
Created symlink /etc/systemd/system/hibernate.target.wants/battery-manager.service → /etc/systemd/system/battery-manager.service.
Created symlink /etc/systemd/system/hybrid-sleep.target.wants/battery-manager.service → /etc/systemd/system/battery-manager.service.
Created symlink /etc/systemd/system/suspend-then-hibernate.target.wants/battery-manager.service → /etc/systemd/system/battery-manager.service.
Battery manager service enabled ✓
(可选)
sudo cp limitd.sh /usr/local/bin
limitd.sh 100
删除
很奇怪为什么作者没有给出卸载服务的步骤,对于强迫症用户比较难受。
sudo systemctl stop battery-manager.service
sudo systemctl disable battery-manager.service
sudo rm /etc/systemd/system/battery-manager.service
查看有没有这个阈值管理文件
ls /sys/class/power_supply/BAT*/charge_control_end_threshold
echo 100 | sudo tee /sys/class/power_supply/BAT?/charge_control_end_threshold > /dev/null
其他
虽然充电阈值确实可以控制,且在登录之前,但还是有5秒左右会充电。
类型 | 优点 | 缺点 |
---|---|---|
service | 可在登录前启用 | 修改较为麻烦 |
gnome插件 | 操作方便 | 需在开机登录后启用 |
如果想要更快的执行(未经测验,修改存在风险)
从你给出的脚本和之前的讨论来看,你或许希望电池充电阈值的设置能更快生效,或者在系统启动流程里更早执行。下面为你提供几种能够加快脚本执行或者让其在更早阶段执行的方法。
1. 优化 Systemd 服务的启动时机
你当前的脚本是通过 Systemd 服务在多用户目标启动后执行的。若要让脚本更早执行,可以考虑修改服务单元文件里的依赖关系和启动时机。
把 After
和 WantedBy
这些参数修改成系统启动流程里更早的目标,例如 basic.target
。以下是修改后的服务文件示例:
[Unit]
Description=To set battery charge threshold
After=basic.target
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'echo $max > /sys/class/power_supply/BAT?/charge_control_end_threshold'
[Install]
WantedBy=basic.target
2. 使用 initramfs 执行脚本
initramfs 是在真正的根文件系统挂载之前就会被加载并执行的一个临时根文件系统。你可以把脚本集成到 initramfs 中,这样就能在系统启动的早期阶段执行。
步骤
- 复制脚本:把脚本复制到
/usr/local/sbin
目录下,并且赋予执行权限。
sudo cp your_script.sh /usr/local/sbin/
sudo chmod +x /usr/local/sbin/your_script.sh
- 修改 initramfs 配置:编辑
/etc/initramfs-tools/hooks
目录下的一个脚本,或者创建一个新的脚本,在其中添加执行脚本的命令。
#!/bin/sh
PREREQ=""
prereqs() {
echo "$PREREQ"
}
case "$1" in
prereqs)
prereqs
exit 0
;;
esac
. /usr/share/initramfs-tools/hook-functions
copy_exec /usr/local/sbin/your_script.sh /sbin
# 执行脚本
if [ -x /sbin/your_script.sh ]; then
/sbin/your_script.sh
fi
- 更新 initramfs:
sudo update-initramfs -u
3. 编写 udev 规则
udev 是 Linux 系统里用于管理设备节点的工具,你可以编写 udev 规则,在电池设备被检测到的时候执行脚本。
步骤
- 创建 udev 规则文件:
sudo nano /etc/udev/rules.d/99-battery-threshold.rules
- 添加规则内容:
SUBSYSTEM=="power_supply", ATTR{type}=="Battery", ACTION=="add", RUN+="/usr/local/sbin/your_script.sh"
- 重新加载 udev 规则:
sudo udevadm control --reload-rules
sudo udevadm trigger
代码示例
下面是一个修改后的 battery-manager.service
文件示例,让它在 basic.target
之后启动:
这些方法可以让脚本在系统启动过程中更早执行,从而更快地设置电池充电阈值。你可以根据实际需求选择合适的方法。
命令行快捷修改的脚本
select_limit.sh
#!/bin/bash
# 使用 whiptail 创建一个菜单对话框
choice=$(whiptail --title "选择电池充电上限" --menu "请选择一个选项:" 15 60 3 \
"1" "60%" \
"2" "80%" \
"3" "100%" 3>&1 1>&2 2>&3)
# 检查用户是否取消了对话框
exitstatus=$?
if [ $exitstatus = 0 ]; then
case $choice in
1)
limitd.sh 60
;;
2)
limitd.sh 80
;;
3)
limitd.sh 100
;;
esac
else
echo "操作已取消。"
fi
sudo cp select_limit.sh /usr/local/bin/
我多创了几个别名,防止时间长了忘记了,当然也可以直接看/usr/local/bin目录下有什么脚本
cd /usr/local/bin/
sudo ln -s select_limit.sh batteryctl
sudo ln -s select_limit.sh battery
sudo ln -s select_limit.sh btr