Salt macOS 电源管理实战:基于 mac_power 模块统一管控系统休眠与唤醒策略
运维配置管理后端【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址https://gitcode.com/gh_mirrors/sa/salt点击查看免费下载导读mac_power是 Salt 生态中专用于 macOS 的执行模块Execution Module负责通过systemsetup命令读取与修改系统的电源设置包括电脑/显示器/硬盘的休眠时间、Modem 与网络唤醒、断电自动重启、死机自动重启、电源键休眠开关等。它于 2016.3.0 版本引入是 Salt 在 macOS 上实现统一电源治理的核心入口。阅读本文后你将掌握power模块的完整函数清单、参数合法范围与校验规则、底层命令调用链并能结合源码与测试用例在真实环境中安全地查询和修改 macOS 电源策略。一、模块定位与加载机制mac_power模块的完整实现在 salt/modules/mac_power.py其虚拟名__virtualname__为power因此在 Salt 命令行与状态State中统一以power.*形式调用例如salt * power.get_sleep。模块的加载受平台严格限制加载逻辑def __virtual__(): if not salt.utils.platform.is_darwin(): return ( False, The mac_power module could not be loaded: module only works on macOS systems., ) return __virtualname__只有当 minion 运行在 macOSDarwin上时模块才会被加载为power在其他操作系统上加载会返回False及失败原因power.*调用将不可用。从源码结构看该模块本身不直接执行系统命令而是完全复用 salt/utils/mac_utils.py 中封装的 macOS 辅助工具函数包括execute_return_success、execute_return_result、parse_return、validate_enabled、confirm_updated等。这种模块只做业务编排、工具层负责命令执行的分层设计在 Salt 的 macOS 相关模块中是一贯风格mac_utils同样仅在 Darwin 上加载。二、底层辅助函数mac_power 的地基理解power模块的每个函数行为前有必要先弄清它依赖的五个核心工具函数均定义于 salt/utils/mac_utils.py工具函数作用关键行为execute_return_success(cmd)执行命令并仅返回是否成功retcode ! 0或输出含 not supported 时抛CommandExecutionError否则返回Trueexecute_return_result(cmd)执行命令并返回 stdout失败时抛出带返回码、输出、错误的异常成功返回原始标准输出parse_return(data)解析冒号分隔的输出对Time Zone: America/Denver这类输出取冒号后部分即返回实际值validate_enabled(enabled)将各种输入归一化为on/off字符串仅接受on/off/yes/no布尔与整数按真值转换0返回off其余整数返回onconfirm_updated(value, check_fun, normalize_ret, wait5)轮询确认系统参数已生效最多等待wait默认 5秒每秒调用一次check_fun与目标值比对匹配即返回Trueconfirm_updated的意义在于macOS 的systemsetup修改配置后并非立刻生效直接返回成功并不可靠。该函数通过设置后主动回读并轮询的方式保证幂等与收敛这也正是 2016.3.5 版本中 PR#37351give macOS time to change setting引入的修复点见 发布说明。三、休眠时间管理一分钟读懂所有 sleep 函数3.1 参数校验规则_validate_sleep所有set_*_sleep函数在构造systemsetup命令前都会先经过内部辅助函数_validate_sleep(minutes)实现位置做严格参数校验。其规则可以归纳为一张表传入类型合法取值归一化结果非法输入的处理int1 180原样返回超出范围抛SaltInvocationErrorstrNever/Off大小写不敏感统一转为Never其他字符串抛SaltInvocationErrorboolFalseNeverTrue抛SaltInvocationError因为 Salt CLI 会把On转成布尔True其他类型如浮点数——抛SaltInvocationError校验逻辑的单元测试完整覆盖了这些分支见 tests/pytests/unit/modules/test_mac_power.py_validate_sleep(179) 179、_validate_sleep(181)抛异常、never与off归一化为Never、True抛异常、False返回Never、浮点数172.7抛异常。需要注意一个易踩的坑不能传入On来设置休眠因为 Salt CLI 在解析命令行参数时会把字符串On转换为布尔True从而触发Invalid Boolean Value for Minutes错误。要表达永不休眠必须使用Never或Off。3.2 单项查询与设置电脑休眠Computer Sleepsalt * power.get_computer_sleep salt * power.set_computer_sleep 120 salt * power.set_computer_sleep offget_computer_sleep执行systemsetup -getcomputersleep并用parse_return提取冒号后的值set_computer_sleep执行systemsetup -setcomputersleep value随后用confirm_updated回读确认实现。显示器休眠Display Sleepsalt * power.get_display_sleep salt * power.set_display_sleep 120 salt * power.set_display_sleep off对应底层命令systemsetup -getdisplaysleep/systemsetup -setdisplaysleep实现。硬盘休眠Hard Disk Sleepsalt * power.get_harddisk_sleep salt * power.set_harddisk_sleep 120 salt * power.set_harddisk_sleep off对应底层命令systemsetup -getharddisksleep/systemsetup -setharddisksleep实现。3.3 一键设置全部休眠set_sleep(minutes)用同一个值同时设置电脑、显示器、硬盘三者的休眠时间实现salt * power.set_sleep 120 salt * power.set_sleep never其内部执行systemsetup -setsleep value后会依次对get_computer_sleep、get_display_sleep、get_harddisk_sleep三个回读函数调用confirm_updated只有全部确认生效才返回True。相应地get_sleep()返回包含Computer、Display、Hard Disk三个键的字典salt * power.get_sleep查询三类设置的典型返回值形如after 90 minutes或Never。功能测试tests/pytests/functional/modules/test_mac_power.py验证了set_computer_sleep(90)后回读为after 90 minutes、set_computer_sleep(Off)后回读为Never可作为预期行为的参照。四、唤醒与异常恢复策略布尔型开关函数族与休眠时间不同唤醒与自动重启类设置是开/关语义。模块通过mac_utils.validate_enabled将输入归一化为on/off再拼入systemsetup命令。所有这类函数的参数都接受布尔值True/False字符串On/Off、Yes/No大小写不敏感整数1开、0关读取类函数的返回值均为布尔型内部将回读值经validate_enabled归一化后与on比较设置类函数则通过confirm_updated(..., True)以归一化方式确认变更。4.1 Modem 唤醒salt * power.get_wake_on_modem salt * power.set_wake_on_modem True对应底层命令systemsetup -getwakeonmodem/systemsetup -setwakeonmodem实现。该功能依赖硬件支持不支持时会由execute_return_result抛出CommandExecutionError错误信息含 not supported。4.2 网络唤醒salt * power.get_wake_on_network salt * power.set_wake_on_network True对应底层命令systemsetup -getwakeonnetworkaccess/systemsetup -setwakeonnetworkaccess实现。功能测试中该设置在不支持的机器上会跳过并提示 Wake On Network Access: Not supported on this machine见 功能测试。4.3 断电后自动重启salt * power.get_restart_power_failure salt * power.set_restart_power_failure True对应底层命令systemsetup -getrestartpowerfailure/systemsetup -setrestartpowerfailure实现。适合服务器类 Mac 在意外断电恢复后自动拉起系统。4.4 死机Freeze后自动重启一个已知的 Apple 缺陷salt * power.get_restart_freeze salt * power.set_restart_freeze True对应底层命令systemsetup -getrestartfreeze/systemsetup -setrestartfreeze。源码 docstring 明确指出该设置实际无法被修改——命令执行成功但系统配置并不会真正更新推测是 macOS 本身的缺陷实现注释。因此set_restart_freeze(off)往往返回False即使返回True回读结果也不会改变。功能测试甚至专门断言了这一反常行为测试用例# This will return False because mac fails to actually make the change ret power.set_restart_freeze(off) assert not ret # Even setting to off returns true, it actually is never set # This is an apple bug ret power.get_restart_freeze() assert ret源码保留该函数是为了在 Apple 修复缺陷后能够无缝启用。实际使用时应避免依赖此项设置来保证高可用。4.5 允许电源键休眠电脑salt * power.get_sleep_on_power_button salt * power.set_sleep_on_power_button True对应底层命令systemsetup -getallowpowerbuttontosleepcomputer/systemsetup -setallowpowerbuttontosleepcomputer实现。功能测试同样验证了开/关两个方向的设置与回读测试用例。五、在 Salt 中实际使用CLI 与状态集成5.1 命令行CLI用法所有函数都可通过salt命令对目标 minion 下发虚拟名统一为power# 查询综合休眠状态 salt * power.get_sleep # 设置电脑 2 小时后休眠 salt mac-minion* power.set_computer_sleep 120 # 设置永不休眠 salt * power.set_sleep never # 开启网络唤醒 salt * power.set_wake_on_network True # 开启断电自动重启 salt * power.set_restart_power_failure True5.2 在 State 中编排power.*属于执行模块可直接通过module.run状态在 SLS 中声明式管理。例如新建一个power.slsconfigure_mac_power: module.run: - name: power.set_computer_sleep - minutes: 120需要说明的是mac_power模块本身不提供专属状态模块State Module电源策略的收敛完全依靠执行函数加module.run编排同时也可以借助confirm_updated的回读语义保证每次执行后配置真实生效。5.3 适用前提与限制目标机器必须为 macOSDarwin且安装了systemsetup二进制macOS 自带修改电源策略通常需要 root 权限功能测试因此标记了skip_if_not_root见 功能测试标记get_restart_freeze/set_restart_freeze受 Apple 缺陷影响回读值不可信部分唤醒类功能依赖硬件与机型支持不支持时模块会抛出CommandExecutionErrornot supported该模块只管理systemsetup覆盖的电源项不包含电池健康、能耗模式等更细粒度的 macOS 电源策略这些不属于当前模块职责范围。六、测试体系如何验证模块行为mac_power在仓库中配有单元测试与功能测试两级验证单元测试tests/pytests/unit/modules/test_mac_power.py不依赖真实系统专注_validate_sleep的参数校验分支覆盖合法整数、越界整数、合法字符串、非法字符串、布尔值、浮点数等全部输入形态功能测试tests/pytests/functional/modules/test_mac_power.py在真实 macOS 上运行标记了skip_if_binaries_missing(systemsetup)、slow_test、destructive_test、skip_if_not_root、skip_unless_on_darwin并且每个测试都通过_reset_*fixture 在结束后把系统电源设置恢复原状避免污染测试环境。这类先回读、后还原的 fixture 模式同样适用于用户在生产环境中编写自己的幂等校验逻辑。七、总结mac_power虚拟名power是 Salt 在 macOS 上管理电源设置的唯一执行入口它把systemsetup的各类电源项封装为语义清晰、参数严格校验、带回读确认的函数族休眠时间get/set_computer_sleep、get/set_display_sleep、get/set_harddisk_sleep以及一键设置的get/set_sleep参数限 1~180 分钟或Never/Off唤醒与恢复get/set_wake_on_modem、get/set_wake_on_network、get/set_restart_power_failure、get/set_sleep_on_power_button参数为开/关语义已知缺陷get/set_restart_freeze受 Apple 系统缺陷影响无法真正生效生产环境需规避。实际运维中建议先通过power.get_sleep与power.get_wake_on_network摸清机器当前状态再结合module.run状态与回读确认机制收敛到目标配置从而在批量管理 Mac 集群时获得一致、可验证的电源治理结果。赞分享运维配置管理后端【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址https://gitcode.com/gh_mirrors/sa/salt点击查看免费下载相关推荐Zephyr RTOS电源状态管理系统休眠与唤醒机制Zephyr RTOS电源状态管理系统休眠与唤醒机制 在嵌入式系统开发中电源管理直接影响设备续航能力和运行效率。Zephyr RTOS实时操作系统作为新操作系统嵌入式RTOS物联网Parsec VDD电源事件处理系统休眠与唤醒的智能管理Parsec VDD电源事件处理系统休眠与唤醒的智能管理 Parsec VDD作为一款功能强大的虚拟显示器驱动程序在系统电源管理方面展现了出色的智能处理能力桌面应用驱动开发PowerToys Awake保持唤醒防止系统休眠的智能电源管理PowerToys Awake保持唤醒防止系统休眠的智能电源管理 痛点直击你是否遇到过这些场景 在日常工作中我们经常需要电脑保持持续运行状态下载大型文桌面应用开发工具上一篇【亲测免费】 探秘sd-trainer一款强大的智能训练工具下一篇Binary Eye 开源项目安装与使用文档创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考