Mac OS 中如何优雅的创建定时任务

Mac 中可以使用 crontab 一样的方式来使用定时任务。但是 crontab 来配置定时任务很容易出错。在 Mac 中,配置定时任务有更好的选择。

Mac 中有一个 launchctl 工具,这个工具是 Mac OS X 中用于启动进程的工具。Mac 中的各个进程都被配置成了 plist 文件。需要启动一个进行的时候只要执行以下命令:

1
launchctl load xxx.plist

停止一个进程只需要:

1
launchctl unload xxx.plist

Plist 文件配置

在 Mac 系统中,可以将需要处理的事情都写在 plist 文件中,plist 是一个 xml 格式的文件。plist 文件根据不同的需要可以放在不同的目录底下。Mac OS X 中支持放 plist 的目录如下:

  • /Library/LaunchDaemons: 系统启动后就会执行
  • /Library/LaunchAgents: 当用户登录系统后才会执行
  • ~/Library/LaunchAgents: 用户自定义的 plist
  • /System/Library/LaunchAgents: 由 Mac OS X 为用户定义的任务
  • /System/Library/LaunchDaemons: 由 Mac OS X 定义的守护进程任务

一个常见的 plist 文件模板如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

<?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>
<!--Plist 名称,必须唯一-->
<key>Label</key>
<string>cn.rayjun..plist</string>
<!-- 指定要运行的程序的名称,可以是一个程序或者是一段脚本 -->
<key>ProgramArguments</key>
<array>
<string>/path/to/programer</string>
</array>
<!-- 执行时间的指定 -->
<key>StartCalendarInterval</key>
<dict>
<!--在第几分钟会被执行 -->
<key>Minute</key>
<integer>00</integer>
<!-- 在第几个小时会被执行-->
<key>Hour</key>
<integer>22</integer>
</dict>
<!-- 运行日志 -->
<key>StandardOutPath</key>
<string>/path/to/log/x.log</string>
<!-- 错误日志 -->
<key>StandardErrorPath</key>
<string>/path/to/err/x.err</string>
</dict>
</plist>

plist 脚本编写完成后放入到相应的目录底下即可,然后执行一下 launchctl load xx.plist 就可以启动任务。

定时任务配置

在 Plist 中,支持两种定时任务的设置:

  • StartInterval:定义任务多长时间(单位,秒)执行一次
  • StartCalendarInterval:这个配置类似在 crontab 中的配置,指定具体的执行日期、星期、每月、每日的各个时间点,具体参照上面的配置文件。月份和天数的配置类似。

(完)

微信公众号

© 2018 ray