launchd Intro:macOS 自动化实践
launchd Intro:macOS 自动化实践
Bin Lianlaunchd Intro:macOS 自动化实践(以 send_daily_2330.sh 为例)
本文面向 macOS 环境,介绍如何使用 launchd 将一个项目脚本稳定地"每天 23:30 自动执行",并给出排错方法与最佳实践。
1. 为什么用 launchd(而不是 cron)
launchd 是 macOS 原生的作业调度与守护进程管理系统,适合做长期、稳定的定时任务。
对比 cron:
launchd与系统更一致(用户登录、权限、沙盒、安全策略、日志系统)launchd支持更丰富的触发条件与更好的状态查询(launchctl print)cron在 macOS 上更容易遇到 PATH/环境变量缺失、权限与唤醒不稳定等问题
如果你的任务需要访问 Apple Calendar(EventKit)、钥匙串、用户目录文件等,优先使用 LaunchAgents(用户态)而不是 LaunchDaemons(系统态)。
2. LaunchAgents vs LaunchDaemons:放哪里?
通常建议用 LaunchAgents(只对当前用户生效):
- plist 路径:
~/Library/LaunchAgents/ - 运行身份:当前登录用户
- 常见用途:桌面自动化、访问用户日历/文件、发送邮件、个人定时脚本
LaunchDaemons(全局、系统态):
- plist 路径:
/Library/LaunchDaemons/ - 运行身份:root
- 常见用途:系统服务、全局守护进程(不建议用于个人日历与邮件)
3. 创建 launchd 配置(plist)
创建文件(建议 label 规范化、全小写、域名式命名):
~/Library/LaunchAgents/com.aiworkflow.senddaily2330.plist
内容示例:
1 |
|
4. conda 环境注意事项(非交互环境)
非交互环境(launchd)里,conda 可能不在 PATH,导致脚本里 command -v conda 失败。
推荐策略:
- 最稳:在脚本里固定
CONDA_BASE(例如/Users/lianbin/miniconda3),再source "$CONDA_BASE/etc/profile.d/conda.sh"后conda activate ... - 次稳:在 plist 的
EnvironmentVariables里补PATH,把 conda bin 加进去
5. 安装、启动、查看状态(命令)
macOS 新版推荐使用 bootstrap/bootout(而不是旧的 load/unload)。
5.1 启动
1 | launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.yourlabel.plist |
5.2 查看状态
1 | launchctl print gui/$(id -u)/com.yourlabel |
5.3 停止与卸载
1 | launchctl disable gui/$(id -u)/com.yourlabel |
6. 日志与排错
常见排错顺序:
- 先看
launchd.err(多为环境/权限/路径问题) - 再看业务日志
- 执行一次手动运行确认脚本本身可跑
launchctl print ...查看最近一次退出码与原因
7. 推荐的验证流程
- 手动运行脚本确认可执行
- 创建 plist,并用
kickstart立即触发一次 - 检查日志确认执行成功
感谢你赐予我前进的力量|Thank you for your support!
赞赏者名单|List of supporters
因为你们的支持让我意识到写文章的价值🙏
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Bin|Brain|Bin!
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果









