mise bootstrap macos launchd-agents status:检查 macOS LaunchAgents 声明状态与一致性

发布时间:2026/9/10 11:38:15
mise bootstrap macos launchd-agents status:检查 macOS LaunchAgents 声明状态与一致性 mise bootstrap macos launchd-agents status检查 macOS LaunchAgents 声明状态与一致性【免费下载链接】misedev tools, env vars, task runner项目地址: https://gitcode.com/GitHub_Trending/mi/misemise bootstrap macos launchd-agents status是 misedev tools、env vars、task runner在 macOS 上对[bootstrap.macos.launchd.agents]中声明的用户级 LaunchAgent 进行只读状态检查的命令。本文基于 状态命令文档 展开结合其关联的 LaunchAgents 配置指南、CLI 实现源码与端到端测试完整讲解该命令的参数、四种状态语义、JSON 输出结构以及在 CI/脚本中将其作为幂等性校验手段的用法。读完本文你将能够解读 status 的每一行输出并把它与apply命令组合成可验证、可回滚的 LaunchAgent 部署流程。命令概览只读、幂等、可脚本化status子命令位于mise bootstrap macos launchd-agents之下其完整用法与关键属性如下见 状态命令文档mise bootstrap macos launchd-agents status [-J --json] [--missing]Effect:read-only —— 该命令只读取配置、plist 文件与 launchd 域状态不写任何文件、不加载或卸载任何服务Source code:src/cli/bootstrap.rs它在命令效果表中被登记为Read级别见 src/cli/command_effects.rs与bootstrap macos launchd-agents applyWrite形成只读/可写的明确区分。从 CLI 定义看src/cli/bootstrap.rs该子命令结构体BootstrapLaunchdStatus声明了两个可选标志-J/--json与--missing。命令在run()中的执行流程为加载配置 → 从[bootstrap.macos.launchd.agents]收集全部 agent 请求 → 检查 launchd 可用性 → 逐一计算每个 agent 的期望 plist 与实际状态的差异 → 输出表格或 JSON → 根据--missing决定退出码见 src/cli/bootstrap.rs。前置知识status 检查的对象从哪来status本身不创建任何东西它检查的对象完全来自mise.toml中的声明式配置。例如在 LaunchAgents 配置指南 中给出的最小示例[bootstrap.macos.launchd.agents.my-sync] program ~/.local/bin/my-sync args [--watch] run_at_load true environment { PATH /opt/homebrew/bin:/usr/bin:/bin } working_directory ~ stdout_path ~/Library/Logs/my-sync.log stderr_path ~/Library/Logs/my-sync.err.log关键事实每个 agent 会被写成~/Library/LaunchAgents/dev.mise.name.plistlabel 前缀固定为dev.mise.源码见 src/system/launchd.rsagent 名称只允许字母、数字、.、_、-校验逻辑见 src/system/launchd.rs 及单元测试test_launchd_request_validationprogram为必填项program、working_directory、stdout_path、stderr_path以及queue_directories中的每个条目都会在写 plist 前展开裸~与~/为当前用户主目录src/system/launchd.rs。也就是说status 报告的期望状态完全由这段 TOML 决定它把期望状态渲染成一份 plist再与磁盘上的实际 plist 以及 launchd 中的加载状态逐一比对。四种状态loaded / unloaded / differs / missing根据 LaunchAgents 配置指南 的说明status会把每个 agent 报告为以下四种状态之一。这些状态的判定逻辑定义在 src/system/launchd.rs 的status()函数中状态含义判定逻辑源码loadedplist 文件存在且内容与期望一致且服务已加载到 launchdstd::fs::read成功、plist_matches为真、launchctl print gui/$UID/dev.mise.name成功unloadedplist 存在且内容一致但服务未被加载同上但launchctl print失败differsplist 存在但内容与当前配置期望不一致可能还停留在旧配置std::fs::read成功但plist_matches为假missingplist 文件不存在~/Library/LaunchAgents/dev.mise.name.plist未找到读取返回NotFound其中plist_matches的实现是把磁盘上的 XML plist 与根据当前 TOML 渲染出的期望字典做严格相等比较src/system/launchd.rs任何一个键值不同例如改了args、environment或throttle_interval都会被判定为differs。默认表格输出包含四列Name、Label、Path、State见 src/cli/bootstrap.rs示例Name Label Path State my-sync dev.mise.my-sync /Users/you/Library/LaunchAgents/dev.mise.my-sync.plist loaded如果配置中没有任何 agent[bootstrap.macos.launchd.agents]为空命令会输出日志级信息nothing configured in [bootstrap.macos.launchd.agents]而非报错src/cli/bootstrap.rs。标志详解-J/--json 与 --missing状态命令提供两个行为标志定义见 src/cli/bootstrap.rs。-J, --json机器可读输出用法mise bootstrap macos launchd-agents status --json作用以 JSON 格式输出便于被脚本、CI 或上游工具解析。JSON 输出的顶层是一个包含launchd键的对象其结构由 src/cli/bootstrap.rs 生成格式大致如下{ launchd: { available: true, agents: [ { name: my-sync, label: dev.mise.my-sync, path: /Users/you/Library/LaunchAgents/dev.mise.my-sync.plist, loaded: true, state: loaded } ] } }值得注意的细节当 launchd 不可用时见下文非 macOS 平台JSON 结构变为{ launchd: { available: false, reason: ... } }调用方可以通过available字段显式区分平台不支持与配置存在但状态异常src/cli/bootstrap.rsloaded字段表示进程级加载状态launchctl print是否成功state则是上述四种综合状态。--missing失败即退出码 1用法mise bootstrap macos launchd-agents status --missing作用只要存在任何一个 agent 不在期望状态即unloaded、differs或missing任一命令就以退出码 1 结束全部loaded时退出码为 0。对应源码src/cli/bootstrap.rs、src/cli/bootstrap.rslet state match s.state { LaunchdState::Loaded loaded, LaunchdState::Unloaded { any_missing true; unloaded } LaunchdState::Differs { any_missing true; differs } LaunchdState::Missing { any_missing true; missing } }; // ... if self.missing any_missing { return Err(crate::request_exit(1)); }这正是它在部署流水线中的核心价值可以在apply之前先做一致性校验也可以在apply之后做收敛验证。示例用法mise bootstrap macos launchd-agents status --missing \ echo 所有 LaunchAgent 均处于期望状态-h, --help内联帮助与所有 mise 子命令一致-h/--help打印该命令的用法、标志说明与相关文档导航。非 macOS 平台与 launchd 不可用时的行为status是macOS-only的。根据 LaunchAgents 配置指南 的Semantics一节在其他平台上[bootstrap.macos.launchd.agents]声明是惰性的inertmise bootstrap macos launchd-agents status会把每个条目列为skippedapply则直接忽略它们可用性判定逻辑见 src/system/launchd.rscfg!(target_os macos)且launchctl在 PATH 中才算可用否则返回原因非 macOS 为only available on macosmacOS 上缺launchctl为launchctl not found表格模式下不可用时会输出skipped (原因)状态列例如skipped (only available on macos)src/cli/bootstrap.rs。端到端测试也验证了这一点在 e2e/cli/test_bootstrap 中非 Darwin 平台执行mise bootstrap macos launchd-agents status断言输出包含skipped而 Darwin 平台断言包含声明的 agent 名my-sync。因此同一份mise.toml可以安全地跨平台共享。运行前提GUI 登录域与会话要求命令本身的注释给出了一个重要运行前提src/cli/bootstrap.rs必须从预期用户的会话中运行。status/apply操作的 launchd 域是gui/$UID见 src/system/launchd.rs这是图形登录域仅通过 SSH 进入的会话可能不存在该域导致无法查询或加载用户 LaunchAgent。此外agent 进程接收的是launchd 的环境而不是交互式 shell 的激活环境因此配置中应使用显式可执行路径并声明所需的环境变量如示例中的PATHprogram与args组成参数向量管道、重定向等 shell 表达式需要显式调用 shell 或使用包装脚本见 LaunchAgents 配置指南。与 apply 组合检查 → 应用 → 再检查status的姊妹命令是mise bootstrap macos launchd-agents apply文档见 apply 命令页它负责把缺失/变更的 agent 写入并加载。二者组合即构成完整的工作流# 1. 查看当前状态 mise bootstrap macos launchd-agents status # 2. 预览将执行的命令dry-run不产生副作用 mise bootstrap macos launchd-agents apply --dry-run # 3. 实际写入 plist 并加载-y 跳过确认 mise bootstrap macos launchd-agents apply --yes # 4. 用 --missing 校验收敛结果失败即退出码 1 mise bootstrap macos launchd-agents status --missingapply的行为src/system/launchd.rs与status的期望一一对应重写变更的 plist →launchctl bootout卸载旧任务若存在且对未加载的常见错误做了容错见bootout_missing_error→launchctl bootstrap gui/$UID plist加载新任务 →launchctl enable启用 → 仅在配置了kickstart true时才执行launchctl kickstart。这也解释了为什么status会报告differs它是配置文件已改但尚未 apply的中间状态。源码级补充状态判定与渲染如何实现最后给出两个可供深入阅读的实现锚点状态判定src/system/launchd.rs中的status()函数完整实现了四态判定is_loaded通过launchctl print gui/$UID/label的退出码判断加载与否src/system/launchd.rs。plist 渲染与比较render_plist()将LaunchdRequest渲染为 XML plistplist_matches()对磁盘文件与期望字典做逐键比较src/system/launchd.rs配套单元测试test_render_plist、test_render_plist_multiple_calendar_intervals等验证了RunAtLoad、KeepAlive、StartCalendarInterval、QueueDirectories等键的映射与~展开行为src/system/launchd.rs。相关文档导航LaunchAgents 配置指南声明语法与全部支持键mise bootstrap macos launchd-agents apply 命令mise bootstrap 总览与执行顺序全局标志与参数语法-C/-E/-q/-v 等【免费下载链接】misedev tools, env vars, task runner项目地址: https://gitcode.com/GitHub_Trending/mi/mise创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考