 macOS Launch Agent 定时任务实践指南

 macOS Launch Agent 定时任务实践指南

这份指南将帮助你在 macOS 上通过 launchctl 正式配置并管理自动化任务。

1. 准备脚本

在配置定时任务之前,确保你的脚本可以独立运行且路径固定。

  • 创建脚本 :例如 ~/Scripts/backup.sh。
  • 使用绝对路径 :脚本内部涉及的路径(如 cd 或文件路径)请务必使用绝对路径,不要使用相对路径。
  • 赋予执行权限:
bash 复制代码
chmod +x ~/Scripts/backup.sh

2. 创建 .plist 配置文件

Launch Agent 的配置文件存储在 ~/Library/LaunchAgents/ 目录下,文件名为 Label 名加 .plist 后缀。

文件位置 :~/Library/LaunchAgents/com.user.myscript.plist

模板内容:

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>com.user.myscript</string> <key>ProgramArguments</key>
    <array>
        <string>/Users/你的用户名/Scripts/backup.sh</string> </array>

    -- 每天12点
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>12</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
    -- 每隔3600s执行一次
    -- <key>StartInterval</key>
    -- <integer>3600</integer>

    <key>StandardOutPath</key>
    <string>/Users/你的用户名/Scripts/logs/backup.log</string> <key>StandardErrorPath</key>
    <string>/Users/你的用户名/Scripts/logs/backup_err.log</string> <key>RunAtLoad</key>
    <true/> </dict>
</plist>

3. 加载并启动任务

配置文件准备好后,需要手动告知系统加载它。

  1. 加载任务(让系统识别并按计划执行):
bash 复制代码
launchctl load ~/Library/LaunchAgents/com.user.myscript.plist
  1. 验证状态:
bash 复制代码
launchctl list | grep com.user.myscript

如果第一列显示数字(PID),说明任务正在运行;如果第二列为 0,说明上次运行成功。


4. 常见配置选项说明

Key (键名) 说明 示例
Label 任务的唯一名称。 com.apple.itunes
ProgramArguments 程序的路径及参数数组。 <array><string>/path/to/script</string></array>
StartInterval 每隔多少秒触发一次任务。 300 (每5分钟)
StartCalendarInterval 指定具体的日期/时间触发。 可以包含 Minute, Hour, Day, Weekday, Month
RunAtLoad 布尔值。加载 plist 或用户登录时是否立即运行一次。 <true/>
StandardOutPath 指定标准输出重定向的文件。 /tmp/my.log
WorkingDirectory 设置脚本执行时的初始工作目录。 /Users/username/project

5. launchctl 常用命令汇总

  • 加载任务 :launchctl load <path_to_plist>
  • 卸载任务 :launchctl unload <path_to_plist> (停止并移除计划)
  • 立即触发一次 :launchctl start <label_name> (用于测试,不论时间是否到达)
  • 强制停止当前任务 :launchctl stop <label_name>

6. 注意事项 ⚠️

  1. 路径权限:
  • LaunchAgents (在用户目录下):以当前登录用户身份运行,适合个人任务。
  • LaunchDaemons (在系统目录下):以 root 身份运行,适合系统级任务。
  1. 绝对路径 :在 .plist 中,所有路径(包括脚本内调用的 python, node, git)最好都写成绝对路径(如 /usr/local/bin/python3),因为 launchctl 的环境变量与终端不同。
  2. 完全磁盘访问权限 (TCC):
  • 如果脚本需要访问照片、文稿、下载文件夹,必须在 系统设置 -> 隐私与安全性 -> 完全磁盘访问权限 中将 终端 或 /bin/sh 添加进去。
  1. 休眠问题:如果电脑在定时时间处于关机状态,任务会在下次开机后尽快补运行;如果是休眠状态,通常会在唤醒后运行。
相关推荐
程序员小杰@几秒前
Spring Boot 常用注解分类速记
java·spring boot·后端
vx_Biye_Design5 分钟前
springboot小学生英语学习APP62773-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·学习·课程设计
吴声子夜歌7 分钟前
Nginx应用与运维——Nginx日志管理
java·运维·nginx
guo_wen_qiang24 分钟前
云服务器nacos搭建-集群&持久化
java·运维·服务器
泡海椒35 分钟前
JQuick-Excel dateFormat 转换实战:日期值与 FORMAT 显示格式的边界
开发语言·python·excel
白杨尚青1 小时前
C++入门篇(十三):vector(上)——动态数组:构造、空间增长与迭代器失效
开发语言·c++·笔记·算法·stl
江江爱编程1 小时前
java零基础保姆级教学01
java·开发语言
9624561 小时前
餐饮 SaaS 优惠券系统架构演进(三):优惠计算引擎——商品级计价、冲突策略与优惠分摊
java·数据库·spring boot
vx_Biye_Design1 小时前
expressDeepSeek社团咨询助手的学生社团管理系统60746-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·课程设计·express