Mac 上利用 launchctl 开启定时任务

前几天写了 Python 脚本进行爬虫,现在利用 launchctl 来定时开启爬虫任务,launchctl 通过 plist 属性列表(Property List)配置。LinuxMac 通用的 crontab 时间间隔可以精确到分钟,而launchctl 时间间隔可以精确到每秒

创建定时运行的任务脚本

run.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

# 记录一下开始时间
echo `date` >> $HOME/log &&
# 进入 /Users/hanks/spider 目录
cd /Users/hanks/spider &&
# 激活 python 虚拟环境 virtualenv
source venv/bin/activate &&
# 运行爬虫脚本
scrapy runspider spider.py &&
# 运行完成
echo 'finish' >> $HOME/log

&& 连接两条命令,当前一条执行完才会继续下一条命令。

创建定时任务文件

task.plsit

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
31
32
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "https://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>

<key>Label</key>
<string>xyz.hanks.spider</string>

<!-- 要运行的程序, 如果省略这个选项,会把ProgramArguments的第一个
元素作为要运行的程序 -->
<key>Program</key>
<string>/Users/zhanks/work/Bookshelf/run.sh</string>

<!-- 每天18:30 -->
<key>StartCalendarInterval</key>
<dict>
<key>Minute</key>
<integer>30</integer>
<key>Hour</key>
<integer>18</integer>
</dict>

<!-- 运行间隔,与StartCalenderInterval使用其一,单位为>秒 -->
<!-- <key>StartInterval</key>-->
<!-- integer>5</integer>-->

<!-- 标准错误输出文件,错误日志 -->
<key>StandardErrorPath</key>
<string>/Users/zhanks/run-err.log</string>

</dict>
</plist>

将定时任务加入系统

1
2
# 加载 task.plist
$ launchctl load task.plist

查看是否添加成功

1
2
$ launchctl list | grep hanks
- 0 xyz.hanks.spider

如果像移除的话

1
2
# 移除 xyz.hanks.spider
$ launchctl remove xyz.hanks.spider

其他完整的 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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "https://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>

<key>Label</key>
<!-- 名称,要全局唯一 -->
<string>xyz.hanks.spider</string>

<!-- 要运行的程序, 如果省略这个选项,会把ProgramArguments的第一个
元素作为要运行的程序 -->
<key>Program</key>
<string>/Users/hanks/run.sh</string>

<!-- 命令, 第一个为命令,其它为参数-->
<key>ProgramArguments</key>
<array>
<string>/Users/hanks/run.sh</string>
</array>

<!-- 运行时间 -->
<key>StartCalendarInterval</key>
<dict>

<key>Minute</key>
<integer>30</integer>

<key>Hour</key>
<integer>9</integer>

<key>Day</key>
<integer>1</integer>

<key>Month</key>
<integer>5</integer>

<!-- 0和7都指星期天 -->
<key>Weekday</key>
<integer>0</integer>

</dict>

<!-- 运行间隔,与StartCalenderInterval使用其一,单位为秒 -->
<key>StartInterval</key>
<integer>30</integer>

<!-- 标准输入文件 -->
<key>StandardInPath</key>
<string>/Users/hanks/run-in.log</string>

<!-- 标准输出文件 -->
<key>StandardOutPath</key>
<string>/Users/hanks/run-out.log</string>

<!-- 标准错误输出文件 -->
<key>StandardErrorPath</key>
<string>/Users/hanks/run-err.log</string>
</dict>
</plist>

LinuxMac 通用的 crontab 定时任务: crontab 定时任务

参考文档
Mac下添加定时任务

文章来自: https://hanks.pub