Linux apmd命令详解

apmd命令是Linux系统中用于高级电源管理的守护进程,主要用于监控电池状态、处理电源管理事件和执行节能策略。
注意:apmd是一个较旧的电源管理工具,主要用于支持APM(Advanced Power Management)BIOS的老旧硬件。现代Linux系统通常使用ACPI(Advanced Configuration and Power Interface)和相关的工具如acpidupowersystemd的电源管理功能。

命令简介

apmd 是Linux系统中用于高级电源管理(APM)的守护进程。它主要用于笔记本电脑和移动设备,监控电池状态、处理挂起/恢复事件,并在电池电量不足时执行预定义的操作。apmd通过读取/proc/apm文件获取电池状态信息,并根据配置执行相应的操作。

命令语法

apmd [选项]

选项说明

选项 说明
-v, --verbose 详细输出模式,显示更多信息
-V, --version 显示版本信息
-p, --proxy 作为其他程序的代理运行
-c, --check 检查配置并退出
-W, --wall 电池电量不足时向所有用户发出警告
-P, --pidfile 文件 指定PID文件位置
-L, --logfile 文件 指定日志文件位置
-u, --utc 使用UTC时间记录日志
-s, --syslog 使用系统日志(syslog)
-S, --shutdown 百分比 设置关机阈值百分比
-w, --warn 百分比 设置警告阈值百分比
-h, --help 显示帮助信息

常用操作示例

示例1:启动apmd守护进程

以后台模式启动apmd:

sudo apmd

启动apmd守护进程,默认使用/etc/apmd.conf配置文件。

示例2:显示详细输出

sudo apmd -v

以详细模式运行apmd,显示更多调试信息。

示例3:设置电池警告和关机阈值

sudo apmd -w 15 -S 5

设置电池警告阈值为15%,关机阈值为5%。

示例4:检查配置文件

apmd -c

检查apmd配置文件语法并退出,不实际启动守护进程。

示例5:向所有用户发出低电量警告

sudo apmd -W -w 10

当电池电量低于10%时,向所有登录用户发送警告消息。

示例6:指定日志文件

sudo apmd -L /var/log/apmd.log

将apmd日志输出到指定的日志文件。

示例7:使用系统日志

sudo apmd -s

将apmd日志发送到系统日志(syslog)。

APM vs ACPI 对比

特性 APM (apmd) ACPI (acpid)
技术标准 高级电源管理 (1992) 高级配置与电源接口 (1996)
控制方式 BIOS控制,操作系统被动响应 操作系统完全控制
硬件支持 较旧的硬件(2000年以前) 现代硬件(2000年以后)
功能特性 基本的电源状态管理 完整的电源、热管理和设备配置
配置复杂度 简单,配置选项有限 复杂,高度可配置
当前状态 已过时,逐渐被淘汰 现代标准,广泛使用

配置文件

配置文件 描述 默认位置
apmd.conf 主配置文件 /etc/apmd.conf
apm/目录 事件脚本目录 /etc/apm/
apmd_proxy 代理程序配置文件 /etc/apmd_proxy
resume.d/ 恢复时执行的脚本 /etc/apm/resume.d/
suspend.d/ 挂起时执行的脚本 /etc/apm/suspend.d/

配置文件示例

/etc/apmd.conf 配置示例:

# APM 守护进程配置文件

# 常规设置
VERBOSE=yes              # 启用详细输出
SYSLOG=no                # 禁用系统日志
UTC=no                   # 使用本地时间

# 电池阈值设置
BATTERY_LOW=15           # 低电量警告阈值(百分比)
BATTERY_CRITICAL=5       # 临界电量关机阈值(百分比)

# 事件脚本
SUSPEND_CMD="/etc/apm/suspend"
RESUME_CMD="/etc/apm/resume"
BATTERY_LOW_CMD="/etc/apm/battery_low"

# 网络设置(挂起前断开网络)
NET_DOWN="yes"
NET_UP="yes"

# 特殊处理
AC_IGNORE="no"           # 忽略交流电源状态
BATTERY_INTERVAL=60      # 电池检查间隔(秒)

# X Window 系统支持
X_USER="username"        # X Window 系统用户名
X_SUSPEND_CMD="/etc/apm/x_suspend"
X_RESUME_CMD="/etc/apm/x_resume"

事件脚本

事件脚本示例(/etc/apm/suspend):

#!/bin/bash
# /etc/apm/suspend - 系统挂起时执行的脚本

# 记录日志
logger "APM: 系统即将挂起"

# 停止网络服务(如果需要)
if [ -x /etc/init.d/networking ]; then
    /etc/init.d/networking stop
fi

# 停止其他服务
if [ -x /etc/init.d/bluetooth ]; then
    /etc/init.d/bluetooth stop
fi

# 同步文件系统
sync

# 在X Window系统中,可能需要通知桌面环境
if [ -n "$X_USER" ]; then
    su $X_USER -c 'export DISPLAY=:0; xset dpms force off'
fi

exit 0

事件脚本示例(/etc/apm/resume):

#!/bin/bash
# /etc/apm/resume - 系统恢复时执行的脚本

# 记录日志
logger "APM: 系统已恢复"

# 重新启动网络服务
if [ -x /etc/init.d/networking ]; then
    /etc/init.d/networking start
fi

# 重新启动其他服务
if [ -x /etc/init.d/bluetooth ]; then
    /etc/init.d/bluetooth start
fi

# 在X Window系统中,可能需要恢复显示
if [ -n "$X_USER" ]; then
    su $X_USER -c 'export DISPLAY=:0; xset dpms force on'
fi

exit 0

工作原理

apmd守护进程的工作流程:

  1. 读取/proc/apm文件获取当前电池状态
  2. 检查电池电量是否低于设定的阈值
  3. 根据配置执行相应的操作(警告、关机等)
  4. 监听电源状态变化(交流电源连接/断开)
  5. 处理挂起/恢复事件,执行相应的脚本
  6. 记录所有电源管理事件到日志

/proc/apm 文件格式示例:

$ cat /proc/apm
1.16 1.2 0x03 0x01 0x03 0x09 100% 1080 sec

字段说明:

  • 字段1:驱动程序版本
  • 字段2:APM BIOS版本
  • 字段3:APM状态标志
  • 字段4:交流电源状态(0x00=断开,0x01=连接)
  • 字段5:电池状态(0x00=高,0x01=低,0x02=临界,0x03=充电)
  • 字段6:电池剩余百分比
  • 字段7:剩余时间(秒)

注意事项

重要提示:
  1. 过时技术:APM是1990年代的电源管理标准,已逐渐被ACPI取代
  2. 硬件限制:仅支持具有APM BIOS的旧硬件(2000年以前的设备)
  3. 功能有限:只提供基本的电源状态管理,不支持现代电源管理功能
  4. 系统兼容性:现代Linux内核可能已移除或减少对APM的支持
  5. 配置复杂:需要手动编写事件脚本以实现特定功能
  6. 安全考虑:脚本以root权限执行,需要确保脚本的安全性
  7. 双系统问题:与Windows双系统时可能出现电源管理冲突
  8. 现代替代:强烈建议在新系统上使用ACPI和相关工具
实用技巧
  • 检查系统是否支持APM:cat /proc/apm(如果文件存在则支持)
  • 查看当前电池状态:apm -lapm -m
  • 检查APM BIOS版本:apm -v
  • 手动触发挂起:apm -Secho -n mem > /sys/power/state
  • 查看apmd进程状态:ps aux | grep apmdsystemctl status apmd
  • 安装apmd(如果未安装):sudo apt install apmd (Debian/Ubuntu)
  • 调试apmd问题:sudo apmd -v -L /tmp/apmd.log 然后检查日志
  • 检查内核APM支持:grep -i apm /boot/config-$(uname -r)

故障排除

常见问题及解决方法:
  1. "apmd: command not found":apmd未安装,使用包管理器安装
  2. "/proc/apm: No such file or directory":系统不支持APM或内核未启用APM
  3. 电池状态不更新:检查apmd进程是否运行,重启apmd服务
  4. 挂起/恢复功能失效:检查事件脚本权限和配置,确保脚本可执行
  5. apmd不响应电源事件:检查系统日志,查看是否有错误信息
  6. 系统意外关机:电池阈值设置过低,调整-S参数
  7. 脚本执行失败:检查脚本语法和路径,确保所有依赖存在
  8. 与现代硬件不兼容:考虑切换到ACPI电源管理

现代替代方案

工具/技术 描述 主要命令
ACPI (acpid) 现代电源管理标准,取代APM acpid, acpi_listen
upower D-Bus服务,提供电源管理信息 upower, upower -d
systemd 现代初始化系统,包含电源管理 systemctl suspend, systemctl hibernate
tlp 高级Linux电源管理工具 tlp, tlp-stat
powertop 电源消耗监控和优化工具 powertop

实际应用案例

案例:在老式笔记本电脑上配置apmd
  1. 检查硬件支持:cat /proc/apm 确认支持APM
  2. 安装apmd:sudo apt install apmd
  3. 备份原配置:sudo cp /etc/apmd.conf /etc/apmd.conf.backup
  4. 编辑配置文件:
    sudo vim /etc/apmd.conf
    # 设置阈值
    BATTERY_LOW=20
    BATTERY_CRITICAL=10
    
    # 启用详细日志
    VERBOSE=yes
    
    # 设置事件脚本
    SUSPEND_CMD="/etc/apm/suspend"
    RESUME_CMD="/etc/apm/resume"
  5. 创建事件脚本:
    sudo vim /etc/apm/suspend
    #!/bin/bash
    logger "APM: Suspending system"
    sync
    exit 0
    
    sudo vim /etc/apm/resume
    #!/bin/bash
    logger "APM: Resuming system"
    exit 0
    
    sudo chmod +x /etc/apm/suspend /etc/apm/resume
  6. 启动apmd服务:sudo systemctl start apmdsudo service apmd start
  7. 设置开机自启:sudo systemctl enable apmd
  8. 测试配置:断开交流电源,观察电池低电量时的行为

ACPI使用示例

在现代系统上使用ACPI的示例:

# 查看ACPI信息
acpi -V

# 查看电池状态
acpi -b

# 查看温度信息
acpi -t

# 监听ACPI事件
sudo acpi_listen

# 使用upower查看详细信息
upower -d

# 使用systemd挂起系统
systemctl suspend

# 使用tlp进行电源管理
sudo tlp start
tlp-stat -b

# 使用powertop优化功耗
sudo powertop --auto-tune