Linux下实现充电器断开自动告警的最优方案咨询
用Linux的inotify实现事件触发式充电器断开告警(替代轮询)
嘿,这个需求太合理了——谁也不想用每秒轮询的方式浪费系统资源对吧?刚好Linux内核提供了inotify机制,完全能实现类似Arduino中断的事件触发逻辑,只有当充电状态真的变化时才执行告警,完美解决你的问题!
核心思路
/sys/class/power_supply/ADP1/online是sysfs提供的充电状态文件,当充电器插拔时,这个文件的内容会被内核自动更新。我们可以用inotifywait工具监听这个文件的修改事件,只有当状态从1(充电中)变为0(仅用电池)时,才触发zenity告警。
步骤1:安装依赖工具
首先确保你的系统安装了inotify-tools包(提供inotifywait命令):
- Ubuntu/Debian系:
sudo apt install inotify-tools - Fedora/RHEL系:
sudo dnf install inotify-tools
步骤2:编写事件触发脚本
创建一个名为charger-alert.sh的脚本,内容如下:
#!/bin/bash # 充电状态文件路径,根据你的实际情况调整(比如有些机器是ACAD而不是ADP1) CHARGER_FILE="/sys/class/power_supply/ADP1/online" # 记录初始状态,避免脚本启动时误触发告警 current_state=$(cat "$CHARGER_FILE") # 持续监听文件修改事件 inotifywait -m -e modify "$CHARGER_FILE" | while read -r dir events file; do # 读取最新状态 new_state=$(cat "$CHARGER_FILE") # 仅当状态从充电(1)变为断开(0)时触发告警 if [ "$current_state" -eq 1 ] && [ "$new_state" -eq 0 ]; then zenity --info --text="Charger unplugged!" fi # 更新状态记录,用于下次判断 current_state="$new_state" done
给脚本添加执行权限:
chmod +x charger-alert.sh
步骤3:测试脚本
直接运行脚本:
./charger-alert.sh
然后拔掉充电器,你应该会立刻看到zenity的告警窗口,插回去则不会触发——完全没有轮询的等待延迟!
步骤4:设置开机自启(可选)
如果希望这个监控脚本开机自动运行,可以创建一个桌面启动项:
- 在
~/.config/autostart/目录下创建charger-alert.desktop文件:[Desktop Entry] Type=Application Exec=/home/你的用户名/charger-alert.sh # 替换成你的脚本实际路径 Hidden=false NoDisplay=false X-GNOME-Autostart-enabled=true Name=Charger Monitor Comment=Alerts when charger is unplugged - 保存后,下次开机脚本就会自动后台运行了。
为什么这是最优解?
和轮询相比,inotify是内核级的事件通知机制:
- 只有当文件内容真的变化时,内核才会通知用户空间的脚本,全程没有主动循环查询,资源消耗几乎为0
- 响应速度是即时的,没有轮询的时间延迟,完全符合你想要的“中断触发”逻辑
内容的提问来源于stack exchange,提问作者aName




