You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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:设置开机自启(可选)

如果希望这个监控脚本开机自动运行,可以创建一个桌面启动项:

  1. ~/.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
    
  2. 保存后,下次开机脚本就会自动后台运行了。

为什么这是最优解?

和轮询相比,inotify是内核级的事件通知机制

  • 只有当文件内容真的变化时,内核才会通知用户空间的脚本,全程没有主动循环查询,资源消耗几乎为0
  • 响应速度是即时的,没有轮询的时间延迟,完全符合你想要的“中断触发”逻辑

内容的提问来源于stack exchange,提问作者aName

火山引擎 最新活动