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