 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. 休眠问题:如果电脑在定时时间处于关机状态,任务会在下次开机后尽快补运行;如果是休眠状态,通常会在唤醒后运行。
相关推荐
3095566662 分钟前
股票接口返回 404 与空数组的排查笔记:证书状态与级别参数
java·笔记·python·ios·iphone·股票数据api·股票数据接口
nice_lcj5205 分钟前
MySQL 存储引擎入门:InnoDB 和 MyISAM 到底怎么选
java·数据库·mysql·面试·innodb·存储引擎·myisam
文丑颜不良啊21 分钟前
LeetCode2861~2880题目解析
java·leetcode
装不满的克莱因瓶32 分钟前
设计模式之策略模式核心概念和应用场景
java·后端·设计模式·架构·系统架构·策略模式
晴天的雨.99237 分钟前
【C++】继承篇
java·开发语言·c++
SomeOtherTime43 分钟前
第 1 讲:内存布局与所有权解剖——栈帧、胖指针与“移动/拷贝”在汇编层面的真实面目
java·开发语言·汇编
qq_406981031 小时前
c++ lamda(三)Lambda表达式
java·前端·c++
头发还在的女程序员1 小时前
Java在线租房系统源码解析:Spring Boot+Vue 3+UniApp房源管理与预约看房方案
java·vue.js·spring boot·租房小程序·租房系统·租房软件
FYKJ_20101 小时前
springboot同人周边订单管理系统48955-计算机毕业设计、课程设计
java·javascript·vue.js·spring boot·django·php·课程设计
总要学点什么1 小时前
第106篇:三维特效-流动线效果——让一颗光点沿整条线一路滚到头
开发语言·javascript·ecmascript·gis·webgl·材质·cesium