Mac定时任务

type
Post
status
Published
summary
crontab 是 Linux 和 Unix 系统中的一个用来设置周期性任务调度的工具,它的全称是 "cron table"。crontab 文件包含了 cron 进程需要执行的任务列表,并指定任务的执行时间。cron 进程会根据 crontab 文件中的配置,在指定的时间自动执行任务。
slug
mac-crontab
date
Oct 18, 2024
tags
Mac
定时任务
category
实践技巧
password
icon
URL
Property
Oct 18, 2024 03:39 AM
crontab 是 Linux 和 Unix 系统中的一个用来设置周期性任务调度的工具,它的全称是 "cron table"。
  • cron:系统服务,负责按照 crontab 文件中的设置周期性地执行任务。
  • crontab:一个包含任务调度时间和命令的文件,可以用 crontab -e 命令进行编辑。
crontab 文件包含了 cron 进程需要执行的任务列表,并指定任务的执行时间。cron 进程会根据 crontab 文件中的配置,在指定的时间自动执行任务。

编辑 crontab 文件

执行 crontab -e 命令进行文件编辑;crontab 文件只有一个,但是这个文件中可以设置多条定时任务。
crontab 文件的每一行代表一条任务,每条任务由 5 个时间字段和一个要执行的命令组成。格式如下:
* * * * * command
每个 * 代表一个时间字段,分别对应以下五个值:
┌───────────── 分钟 (0 - 59):任务要在每个小时的第几分钟执行 │ ┌────────────── 小时 (0 - 23):任务要在每天的几点执行 │ │ ┌─────────────── 日期 (1 - 31):任务要在每个月的哪一天执行 │ │ │ ┌──────────────── 月份 (1 - 12):任务要在每年的哪个月份执行 │ │ │ │ ┌───────────────── 星期几 (0 - 7) :任务要在星期几执行(0-7,0 和 7 都表示星期天,1-6 代表周一到周六) * * * * * command
  • *:表示任意值。例如,*在小时字段,表示“每小时”。
  • ,:表示多个值。例如,1,5,10 在分钟字段,表示在 1、5 和 10 分钟时执行任务。
  • -:表示区间。例如,1-5 在分钟字段,表示从第 1 分钟到第 5 分钟每分钟执行一次任务。
  • /:表示步长。例如,/5 在分钟字段,表示每 5 分钟执行一次。
 
除了具体的时间配置,还可以使用一些特殊的时间标识符来简化任务调度:
  • @reboot:系统启动时执行任务。
  • @hourly:每小时执行一次。
  • @daily 或 @midnight:每天午夜执行一次。
  • @weekly:每周执行一次。
  • @monthly:每月执行一次。
  • @yearly 或 @annually:每年执行一次。
@reboot /path/to/your/script.sh
 
示例:
# 在每周一到周五的14:40执行基金信息爬取,并将日志写到文件 40 14 * * 1-5 /Users/ayd/miniconda3/envs/spider/bin/python /Fund_codes/found_code2.py > /Fund_codes/found_code2.log 2>&1
 

在脚本中设置环境变量

不需要每次都写完整路径,直接使用 python 就可以了。
PATH=/Users/ayd/miniconda3/envs/spider/bin:/usr/local/bin:/usr/bin:/bin 40 14 * * 1-5 python /Fund_codes/found_code2.py > /Fund_codes/found_code2.log 2>&1

查看和更改定时任务

  • 查看定时任务
    • 执行:crontab -l
    • 如果没有设置任务,会显示:no crontab for user
 
  • 更改定时任务
    • 执行:crontab -e 进行更改,删除指定的定时任务
    • 执行:crontab -r 直接删除整个文件,相当于删除当前用户的所有 crontab 任务

遇到的问题

  • 定时任务不执行
    • 问题排查
      • 直接用虚拟环境执行py文件可以执行(用crontab定时就不行)
      • 直接用shll文件执行py文件可以执行(用crontab定时执行sh就不行)
      • 用crontab执行测试文件是可以的
        • 1 * * * * /bin/date >> /Users/ayd/Desktop/time.txt(每分钟将时间写入到桌面的time文件)
    • 可能的解决方案尝试
      • launchctl排查
        • OS X的定时任务统统由 launchctl 来管理的,看看cron 任务的执行情况
          1. 查看cron任务sudo launchctl list | grep cron
            1. 208 0 com.vix.cron
          1. 查看一下启动项的配置locate com.vix.cron
            1. 可能会提示没有数据库,新建数据库:sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist
          1. 查看数据库文件:cat /System/Library/LaunchDaemons/com.vix.cron.plist
              • 注意里面有个keepAlive的条件是 /etc/crontab 是否存在:
              • 检查 /etc/crontab 是否存在: ls /etc/crontab
              • 不存在就新建:sudo touch /etc/crontab
          1. 然后再尝试周期运行
      • cron的磁盘权限被限制(遇到的就是这种情况
        • 系统是 OSX 10.15 Catalina 以上的对 cron 的权限进行了限制,需要在 系统偏好设置 里将 cron 添加 完全磁盘访问权限
          系统偏好设置 -> 安全性与隐私 -> 选择 隐私 -> 左侧菜单找到完全磁盘访问权限,在右侧查看是否有 cron 这个应用
          没有的话就添加进去,然后勾选
          cron 程序所在目录: 终端输入 whereis cron 打印:/usr/sbin/cron 再输入 open /usr/sbin 在打开的文件夹内找到 cron 把这个文件直接拖动到 系统偏好设置 右侧应用列表框内
         
对于本文内容有任何疑问, 可与我联系.