交流适配器插入或电池拔出时的系统事件?

arm*_*ive 8 ubuntu power-management shell-script

Ubuntu 15.04(或者一般来说可能只是 Linux)是否有任何类型的可测量事件,当笔记本电脑的交流电源断开并且设备切换到电池电源时会触发?

例如,我想编写一个小程序来等待该事件,然后对屏幕亮度等内容进行一些调整。我知道有一些解决方案,但我同时也在尝试自学。我是 Linux 的新手(ish),并且已经.NET在 Windows 系统上完成了大部分编码。

我在 中看到了电池状态信息/sys/class/power_supply/,但我假设必须有更好的方法来确定适配器是否已拔下,而不仅仅是在某种计时器上扫描文件的更改。

我试过在谷歌和这些论坛上搜索,但还没有弄清楚如何正确地表达搜索。

Kla*_*ker 22

您正在寻找udev,它检测各种系统状态的变化,包括插入(或拔出)设备。您可以编写 udev 脚本以在连接或移除设备时执行某些操作。

坦率地说,Udev 非常复杂,您需要进行一些非常基本的测试以确保检测到您正在寻找的内容。

基本步骤如下:

监控您的系统:

sudo udevadm monitor

这会告诉您 udev “看到”了什么。

运行此程序后,插入电源,看看 udevadm 会告诉您什么。再次拔掉它:看看 udevadm 告诉你什么。它可能还没有意义,但没关系;您现在知道如何监控 udev,这很有用。

停止该过程,然后执行以下操作:

sudo udevadm info --path=/sys/class/power_supply/ac

或者

sudo udevadm info --path=/sys/class/power_supply/battery

它为您提供有关 AC 和 BATTERY 系统的信息。像这样:

P:/devices/platform/sunxi-i2c.0/i2c-0/0-0034/axp20-supplyer.28/power_supply/battery
E: DEVPATH=/devices/platform/sunxi-i2c.0/i2c-0/0-0034/axp20-supplyer.28/power_supply/battery
E: POWER_SUPPLY_CAPACITY=100
E: POWER_SUPPLY_CURRENT_NOW=0
E: POWER_SUPPLY_ENERGY_FULL_DESIGN=3200
E: POWER_SUPPLY_HEALTH=好
E: POWER_SUPPLY_MODEL_NAME=电池
E: POWER_SUPPLY_NAME=电池
E: POWER_SUPPLY_ONLINE=0
E: POWER_SUPPLY_PRESENT=0
E: POWER_SUPPLY_STATUS=满
E:POWER_SUPPLY_TECHNOLOGY=锂离子
E: POWER_SUPPLY_TEMP=300
E: POWER_SUPPLY_VOLTAGE_MAX_DESIGN=4200000
E: POWER_SUPPLY_VOLTAGE_MIN_DESIGN=3300
E: POWER_SUPPLY_VOLTAGE_NOW=0
E: SUBSYSTEM=power_supply

这些E:行是可用于编写 udev 规则的环境属性。

写一个基本的 udev 规则(我通常只写一个来在偶数发生时在我的驱动器上的某个地方创建一个日志条目;这样,我知道我正在触发某些东西。然后我回去让脚本有用。)

例如: SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_STATUS}=="Charging", RUN+="/path/to/some/script.sh"

或者您可能会使用POWER_SUPPLY_PRESENT=1...您必须根据您在计算机上看到的值进行试验。

将此 udev 脚本放入/etc/udev/rules.d(类似于80.power.rules传统的名称)并重新启动计算机。从技术上讲,您可以重新启动 udev,但我发现这不可靠。

查看插入 AC 时是否触发脚本。

优化您的 udev 规则及其触发的脚本。

udev 还有更多内容,所以深入研究吧!

  • 极好的!谢谢这么用心的回答。我会很高兴阅读有关 `udev` 的内容。 (2认同)