Skip to content

macOS:部署 LaunchAgent 与本地维护任务 ​

本篇以macOS 用户快照作业为例;前置是macOS 14/15、Zsh 路径、用户域与文件权限。源码与输入与下文配置共用同一份文件,示例未执行。

教学版本族:macOS 14/15,Apple Silicon 与 Intel;系统自带 BSD 工具、Zsh 5.9 语义;不承诺所有小版本。核对日期2026-10-17,不称为2026最新版。示例未执行,配置与命令需按目标环境验收。macOS只交付理论,不纳入原生运行验收。

离线快照契约 ​

macOS 快照示例未执行。完整示例只读取系统版本、架构与当前用户编号,打印三行键值,失败返回非零;不写系统、不调用网络、不安装软件。需要 macOS 14/15 上已有 /bin/zsh 与系统工具。README 给出隔离自跑方式;plist 是手动触发用户作业配置,默认不装载、不定时。

脚本与配置文件 ​

macOS 快照源码分别调用固定程序与参数,不能把字符串交给 eval。每条外部命令显式检查状态,报告通过标准输出交给调用者;读取失败就终止,不把部分结果冒充完整快照。依赖清单仅列系统组件,无第三方依赖。下面包含仓库中的完整文件。

bash
#!/bin/zsh
# Theory specimen. Not executed in this work package.
emulate -LR zsh
if (( $# != 0 )); then
  print -u2 -- 'usage: snapshot.zsh'
  exit 2
fi
typeset version architecture uid
if ! version=$(/usr/bin/sw_vers -productVersion); then
  print -u2 -- 'cannot read product version'
  exit 1
fi
if ! architecture=$(/usr/bin/uname -m); then
  print -u2 -- 'cannot read architecture'
  exit 1
fi
if ! uid=$(/usr/bin/id -u); then
  print -u2 -- 'cannot read uid'
  exit 1
fi
printf 'productVersion=%s\narchitecture=%s\nuid=%s\n' "$version" "$architecture" "$uid" || exit 1
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
  <key>Label</key><string>org.showdocs.user-snapshot</string>
  <key>ProgramArguments</key><array>
    <string>/bin/zsh</string>
    <string>/Users/Shared/showdocs-macos-lab/snapshot.zsh</string>
  </array>
  <key>RunAtLoad</key><false/>
  <key>KeepAlive</key><false/>
</dict></plist>
text
# No third-party dependencies. Theory target: macOS 14/15, system /bin/zsh.
# System programs: /usr/bin/sw_vers, /usr/bin/uname, /usr/bin/id.

完整项目位于仓库 examples/m5-next-macos/;README给出全部未来自跑命令与精确清理步骤,正文包含全部源码和输入。

markdown
# macOS 用户快照(未执行)

完整文件为 snapshot.zsh、snapshot.plist、requirements.txt 和本说明。只打印系统版本、进程架构与有效用户编号;没有网络、安装或系统写入。macOS 原生未验证,XML 可解析不代表 launchd 能加载或任务可执行。

前置:macOS14/15、已有系统Zsh、系统工具,普通用户即可。脚本及其父目录须由当前用户拥有且不可被不可信用户改写;不使用sudo。本轮禁止运行、装载或预览,下列命令仅供读者未来隔离环境自跑。

```bash
/bin/zsh ./snapshot.zsh
/bin/zsh ./snapshot.zsh extra
```

第一次预期三行 productVersion、architecture、uid,值随主机变;退出0。第二次预期usage和退出2,stdout为空。工具不可用或读取失败退出1。成功只证明三个字段已读,不证明系统健康。

plist 是完整手动触发配置,无定时、无RunAtLoad、无KeepAlive。若未来选择安装,先把三个文本文件复制到专用目录 `/Users/Shared/showdocs-macos-lab` 并核对所有者和0700权限;该目录不得是链接或既有共享工作区。ProgramArguments 的固定路径与真实路径必须一致;无需安装到系统LaunchDaemons。读者可在普通登录用户下显式选择以下生命周期,不属于本轮执行:

```bash
launchctl bootstrap "gui/$(id -u)" /Users/Shared/showdocs-macos-lab/snapshot.plist
launchctl kickstart "gui/$(id -u)/org.showdocs.user-snapshot"
launchctl print "gui/$(id -u)/org.showdocs.user-snapshot"
launchctl bootout "gui/$(id -u)/org.showdocs.user-snapshot"
```

launchd运行时stdout不一定在当前终端显示,需在其状态中查看退出结果;此配置不保存报告。失败先核对用户域、Label和路径,不禁用SIP/TCC。清理先bootout并确认不再运行;仅删除专用目录内本例文件,若目录原本存在则不可递归删除。未注册时无需操作launchd。无数据变更,无需回滚系统配置。

成功与失败预期 ​

macOS 快照预期成功包含 productVersion、architecture 和 uid 三行,具体值随主机变化;只读成功不证明后台隐私访问或系统健康。参数多余时退出 2,不输出报告;系统工具失败时退出 1。若读者选择装载 plist,需要先把固定 /Users/Shared/showdocs-macos-lab 设为当前用户专用且不可被他人修改的目录,课程不执行此准备。

快照练习与参考解答 ​

题目:为什么 plist 用 ProgramArguments 数组而不是 zsh snapshot.zsh | cat 字符串?为何把输出保存到用户指定文件不能增加系统健康保证?先圈出解释器与重定向的责任。

参考解答:launchd 传参数给程序而不解析管道,重定向应由明确的调用层或配置负责;三字段快照只反映读取时观察,不能证明磁盘、服务和应用正常。

核对资料 ​

继续阅读