用到的工具跟之前提到的脚本开机自启一样,都是Launchctl
具体步骤:
进入 /Library/LaunchDaemons
目录下:cd /Library/LaunchDaemons
创建 timing.plist
定时任务描述文件:
sudo vim timing.plist
输入以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?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
文件标签说明:
Label
:定时任务的名称,这里Label
的值是com.iamwr.launchctl.demo.agent
,要全局唯一,可通过:launchctl list
查看已有的定时任务Program
:是要运行的脚本的名称,这里是/Users/rundouble/Desktop/run.sh
ProgramArguments
: 脚本运行的参数,第一个是运行的命令,其余是运行需要的参数,这里是/Users/rundouble/Desktop/run.sh
,由于运行这个脚本不需要其他参数,所有只有这一个命令RunAtLoad
:表示加载定时任务即开始执行脚本StartInterval
: 定时任务的周期,单位为秒,这里 30 代表每 30s 执行一次脚本StandardOutPath
: 标准输出日志的路径StandardErrorPath
: 标准错误输出日志的路径
加载该定时任务:
launchctl load -w com.iamwr.launchctl.demo.agent.plist
-w
参数会将 .plist 文件中无意义的键值过滤掉,建议加上。
这时,定时任务已加载,由于加上了:
1 2 |
<key>RunAtLoad</key> <true/> |
所以该定时任务成功加载后就开始执行,可以在 /Users/demo/run.log
看到每 30s 打印当前时间:
如果我们的目标不是每 30
秒执行脚本,而是每天固定时间执行脚本,比如每天晚上 22:00
执行脚本,那么我们需要对 .plist
文件进行如下修改:
删除:
1 2 |
<key>StartInterval</key> <integer>30</integer> |
添加:
1 2 3 4 5 6 7 |
<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 年没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!