macOS 的自启背后是 launchd。最常用的是 LaunchAgents:它会在“用户登录后”启动任务,适合启动菜单栏小工具、同步脚本、开发环境服务等。
常见路径:
~/Library/LaunchAgents(只对当前用户生效)
/Library/LaunchAgents(对所有用户生效)
如果你需要系统级、开机即跑(不依赖登录),才考虑 LaunchDaemons(路径通常是 /Library/LaunchDaemons),但它对权限和脚本要求更严格。
下面给一份可复制的最小模板。把它保存为:~/Library/LaunchAgents/com.example.autorun.plist,并把脚本路径替换成你自己的。
Label com.example.autorun ProgramArguments /bin/zsh -lc /Users/yourname/bin/autorun.sh RunAtLoad StandardOutPath /tmp/com.example.autorun.out.log StandardErrorPath /tmp/com.example.autorun.err.log
要点解释:
Label 必须唯一(建议用反向域名)。
ProgramArguments 推荐用数组,不要用旧的 Program。
用 /bin/zsh -lc 是为了让它更像“在终端里运行”,避免环境变量缺失导致脚本找不到命令。
把 plist 放到目录后,用下面命令加载(启用):
launchctl load -w ~/Library/LaunchAgents/com.example.autorun.plist
卸载(停用):
launchctl unload -w ~/Library/LaunchAgents/com.example.autorun.plist
查看当前用户会话里是否存在该任务(不同 macOS 版本输出略有差异):
launchctl list | grep com.example.autorun
如果你只想临时测试,不写入“开机/登录自启”偏好,可以先不加 -w。
坑1:脚本没有可执行权限:确保 chmod +x /Users/yourname/bin/autorun.sh。
坑2:路径写错:launchd 不会帮你扩展 ~,尽量写绝对路径。
坑3:依赖的命令找不到:自启环境往往没有你在终端里配置的 PATH。建议在脚本里显式写 PATH,或用上面模板的 zsh -lc。
坑4:日志没看:先把 StandardOutPath/StandardErrorPath 配好,出错时直接看 /tmp/*.log。
坑5:plist 格式不合法:可以用系统自带工具快速校验:
plutil -lint ~/Library/LaunchAgents/com.example.autorun.plist
官方文档(launchd/启动项):
launchd 相关资料索引(便于查字段/示例):
如果你只是想“登录后自动跑一个任务”,优先用 ~/Library/LaunchAgents + RunAtLoad,并把日志路径写出来。遇到问题先 plutil -lint 再看日志,比盲改更快。