前几天写了 Python 脚本进行爬虫,现在利用 launchctl 来定时开启爬虫任务,launchctl 通过 plist 属性列表(Property List)配置。Linux 和 Mac 通用的 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>
   | 
 
Linux 和 Mac 通用的 crontab 定时任务: crontab 定时任务
参考文档
Mac下添加定时任务
文章来自: https://hanks.pub