macOS 用 launchd 管理常驻任务,用代码签名、SIP 和 Gatekeeper 建立信任链,用 APFS 组织卷与快照,用 TCC 控制用户数据访问,并在 Apple Silicon 上通过 Rosetta 兼容 x86_64。
gui/<uid>、user/<uid>、system 三个域管理任务;域决定任务能访问什么会话、以谁的身份运行。~/Library/LaunchAgents 或 /Library/LaunchAgents,用户登录后加载,运行在用户 GUI 会话,可访问桌面、剪贴板和钥匙串。/Library/LaunchDaemons,开机时由 system 域启动,默认以 root 运行(可用 UserName 降权),没有 GUI 会话,不能弹窗或依赖用户登录;plist 通常要求 root:wheel 且他人不可写。Label 是唯一标识,ProgramArguments 给绝对路径和参数,RunAtLoad/KeepAlive 控制启动与重启,StartCalendarInterval 代替 cron。launchctl load/unload,新接口是 bootstrap/bootout、enable/disable、kickstart;用 launchctl print 看状态,plutil -lint 校验 plist。KeepAlive,需要 GUI 就选 Agent 而不是 Daemon。/System、/usr(/usr/local 除外)、/bin、/sbin 和系统扩展的修改,root 也不能绕过;csrutil status 查看,只能在恢复模式关闭。codesign -dv --verbose=4 查看签名者、Team ID 和 hardened runtime。spctl --assess --type execute 可手动评估。com.apple.quarantine,xattr -p 查看;删除它能绕过首次提示,但也放弃了 Gatekeeper 检查。/opt/homebrew,Intel 默认 /usr/local;brew --prefix 是唯一可靠判断,不要照抄旧教程。$(brew --prefix)/Cellar/<formula>/<version>,再链接到 bin、lib、share;brew list 和 brew --prefix <formula> 可定位实际文件。$(brew --prefix)/bin 是否在 /usr/bin 前面;从 Finder 或 Dock 启动的 GUI 应用通常不继承终端 PATH。/Applications;brew install 与 brew install --cask 不是同一套依赖。brew services start/stop/list 管理用户级 Agent,加 sudo 才写系统级 Daemon。uname -m 返回 arm64 或 x86_64,sysctl -n hw.optional.arm64 判断 Apple Silicon,arch 查看或指定当前进程架构。lipo -info 或 file 查看;系统优先运行原生切片。softwareupdate --install-rosetta 安装。sysctl -n sysctl.proc_translated 返回 1 表示当前进程在 Rosetta 下;arch -x86_64 zsh 可显式开一个 x86 shell。/opt/homebrew,x86 brew 在 /usr/local;混用会把不同架构的库链进同一个进程,典型报错是 mach-o file, but is an incompatible architecture。/;diskutil apfs list 看角色、容量和快照。cp -c 创建克隆,克隆文件初始不占额外空间,修改时才分离。tmutil listlocalsnapshots / 查看,同一磁盘上的快照不是异地备份。df、du 和 Finder 显示的“可用空间”经常不一致;系统/数据分卷让系统路径只读。ls -le 里以 allow/deny 条目出现;目录的 x 决定能否进入,ACL 可以给单个用户额外授权。tccutil reset 只能重置,不能命令行授权。codesign -d --entitlements :- 查看。sudo 提权到 root,但 root 仍受 SIP、TCC 和只读系统卷限制;macOS 默认不启用 root 账户。sudo 能改 /System,忽略 SIP 和只读系统卷。/usr/local 直接套到 Apple Silicon,导致命令找不到。du 的结果判断真实可用空间。system 域,没有 Aqua 登录会话;需要界面、剪贴板或用户钥匙串的任务应做成 LaunchAgent,加载到 gui/<uid> 域。xattr -p com.apple.quarantine 是否有隔离标记,再用 codesign -dv --verbose=4 看签名和证书是否有效,最后用 spctl --assess 判断是否缺少公证。
小程序版
微信扫码,随时查命令