Django实现定时任务的方法有很多种,如果是简单的场景,固定时间进行定时任务,不需要动态的进行配置定时时间,使用django的django-crontab可以很好的实现。django-crontab是利用django的配置去生成一个操作系统层的crontab定时任务。可以与django的项目进行结合,调用函数模型等会更便捷。定时任务一旦开启,则会在操作系统后台一直运行。使用场景根据情况而定。大多都是定时执行django的视图or函数
首先安装django-crontab
pip install django-crontab
INSTALLED_APPS = [
...
'django_crontab',
]
CRONJOBS = [
# 每分钟发送一条通知
# app:为应用名,cron为py文件名,inform为文件中的函数
('*/1 * * * *', 'app.cron.inform', '>> ' + os.path.join(os.path.dirname(BASE_DIR), 'logs/crontab.log'))
]
第一部分为定时任务的执行间隔,第二部分为任务执行文件路径,第三部分为日志路径
(在服务器运行的时候,可以在django目录写个py文件去测试第三部分的拼接是什么,方便到时候找日志)
解决中文字符问题
如果cron文件中有非英文字符,则需要在setting.py中加上
CRONTAB_COMMAND_PREFIX = 'LANG_ALL=zh_cn.UTF-8'
开启定时任务
python manage.py crontab add
显示已经激活的定时任务
python manage.py crontab show
移除定时任务(不移除将一直存在系统后台运行)
python manage.py crontab remove
直接运行定时任务(提前运行而已不影响任务)(任务id在你add的时候前面有一个哈希的id)
python manage.py crontab run <任务id>
基本格式 :
* * * * *
分 时 日 月 周 命令
M: 分钟(0-59)。每分钟用*或者 */1表示
H:小时(0-23)。(0表示0点)
D:天(1-31)。
m: 月(1-12)。
d: 一星期内的天(0~6,0为星期天)。
第一个星号代表分钟,第二个代表小时,第三个代表天,第四个代表月,第五个代表一星期内的第几天
注意:'1 * * * *' 代表每个小时的第一分钟执行定时任务,即,每小时才会更新一次。
我们如果要设置每分钟执行一次定时任务,则需要使用以下
'*/1 * * * *'
'0 */1 * * *' # 每1小时执行一次
'0 10 * * *' # 每天10点执行
'30 19 * * *' # 每天19点30分执行
'0 10 * * 1' # 每周一10点执行
'30 17 * * 5' # 每周五17点30分执行
'0 10 1 10 *' # 每年10月1日10点执行
'0 5,17 * * *' # 每天5:00和17:00执行任务
"""
设置时间组合:
1 * * * * reboot #表示每个小时的1分开始执行 例如 1:1分 2:1分 3:1分
*/1 * * * * reboot #这里的*/1表示每隔一分钟就执行reboot命令了,一小时执行60次
*/5 * * * * reboot #每隔5分钟执行一次,一小时执行12次
1 1,2 * * * reboot #其中的1,2代表每天的1点和2点的第一分钟的时候执行reboot命令,中间的逗号表示不同的时间点
1 1-3 * * * reboot #其中的1-3表示每天的1点到3点的第一分钟的时候执行reboot命令。“-”可以表示一个时间的范围
1 1 1 * * reboot #表示每个月1号的1点1分执行一次reboot
1 1 1-10 * * reboot #表示每个月1到10号都执行一次reboot
1 1 * 1 * reboot #每年1月的每天执行一次重启
1 1 * * 1 reboot #星期一执行一次重启
"""
"""
设置时间结构:
┌────────── minute (0 - 59)
│ ┌──────── hour (0 - 23)
│ │ ┌────── day of month (1 - 31)
│ │ │ ┌──── month (1 - 12)
│ │ │ │ ┌── day of week (0 - 6 => Sunday - Saturday, or
│ │ │ │ │ 1 - 7 => Monday - Sunday)
↓ ↓ ↓ ↓ ↓
* * * * * command to be executed
"""
# 操作系统中存在的定时任务
crontab -e
# 查看系统中存在的定时任务
crontab -l
PS:django-crontab生成的定时任务是基于的操作系统的crontab定时任务,仅在linux和mac系统下可以使用,windows系统不可以使用。进行定时的任务确保没有逻辑or语法bug,可以先在本机测试定时任务是无误的,可以在cron函数中编写简单的print(666)进行测试,会将666输出到log日志中,可以到对应位置查看日志,确保定时任务无误。另外定时任务的开启和django项目的启动无关系
更新PS:要打印日志的话一定要确保文件夹存在,例如
('00 11 * * *', 'app.cron.spider', '>> ' + os.path.join(os.path.dirname(BASE_DIR), 'logs_2023_7/crontabs.log')),
请确保在Django项目同级别目录有logs_2023_7。如果没有logs_2023_7的话。日志就写不进去
PS:之前一个任务死循环了,一直在跑,就把crontab的进程噶了,然后重新跑日志没了,解决方法:重启crontab。我是debian的系统,sudo service cron restart然后就好了
PS:Django任务一直跑就行了,cron这个文件和setting文件随便改了随便丢,然后重新remove add就完事了。不需要重启django项目