马春杰杰 Exit Reader Mode

macOS设置脚本定时运行以及指定间隔时间运行

用到的工具跟之前提到的脚本开机自启一样,都是Launchctl

具体步骤:

进入 /Library/LaunchDaemons 目录下:cd /Library/LaunchDaemons

创建 timing.plist 定时任务描述文件:

sudo vim timing.plist

输入以下内容:

<?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.iamwr.launchctl.demo.agent</string>
    <key>Program</key>
    <string>/Users/rundouble/Desktop/run.sh</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/rundouble/Desktop/run.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>StartInterval</key>
    <integer>30</integer>
    <key>StandardOutPath</key>
    <string>/Users/rundouble/Desktop/run.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/rundouble/Desktop/run.err</string>
</dict>
</plist>

.plist 文件标签说明:

加载该定时任务:

launchctl load -w com.iamwr.launchctl.demo.agent.plist

-w 参数会将 .plist 文件中无意义的键值过滤掉,建议加上。

这时,定时任务已加载,由于加上了:

<key>RunAtLoad</key>
    <true/>

所以该定时任务成功加载后就开始执行,可以在 /Users/demo/run.log 看到每 30s 打印当前时间:

如果我们的目标不是每 30 秒执行脚本,而是每天固定时间执行脚本,比如每天晚上 22:00 执行脚本,那么我们需要对 .plist 文件进行如下修改:

删除:

<key>StartInterval</key>
    <integer>30</integer>

添加:

<key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>22</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>

StartInterval 标签代表每多少秒执行,StartCalendarInterval 标签代表指定时间点执行,所以这两个标签在同一个 .plist 文件中只能存在一个。StartCalendarInterval 的 key 有:

同样使用 launchctl load -w com.iamwr.launchctl.demo.agent.plist 命令可使新的定时任务运行起来,在每天 22:00 时运行。

关于Launchctl的简单介绍:

本文最后更新于2023年1月31日,已超过 1 年没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!