django 定时任务

环境信息

  • centos 7
  • python 3.10
  • django 4.0
  • django-crontab

django-crontab 依赖 Linux 系统中的 crontab,因此只能在 Linux 系统中使用

安装 django-crontab

pip install django-crontab

django-crontab 插件是以 app 的方式存在, 将 django-crontab 添加到 django 工程配置文件 settings.py 中的 INSTALLED_APPS

settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
...
'django_crontab',
]

配置定时任务

假设定时任务路径为 myapp.cron.scheduled_job
编写好定时任务后,要启用定时任务,需要在 django 工程配置文件 settings.py 中配置以下内容

settings.py
CRONJOBS = [
('* * * * *', 'myapp.cron.scheduled_job')
]

如果定时任务需要参数,可以使用如下格式

settings.py
CRONJOBS = [
('* * * * *', 'myapp.cron.scheduled_job', '>> run.log 2>&1')
]

以上定时任务,会将任务执行过程中的标准输出和标准错误输出写入到文件 run.log

也可以使用列表参数

settings.py
CRONJOBS = [
('* * * * *', 'myapp.cron.scheduled_job', ['list_args1', 'list_args2'], {'dict_args1': v1, 'dict_args2': v2}),
('* * * * *', 'myapp.cron.scheduled_job', ['list_args1'])
]

其中,定时任务的第一部分(* * * * *),语法和 Linux 系统 crontab 一致,具体语法可参考: linux crontab 语法

配置好定时任务之后,执行以下命令添加定时任务

python3 manage.py crontab add

运行定时任务

python3 manage.py crontab run 

运行定时任务后,会在系统 crontab 中追加一个定时任务,可使用 crontab -l 命令查看定时任务

$ crontab -l
* * * * * python3 /django/project/manage.py crontab run b4564bdabd9dcb16a9b69d79a612430f >> run.log 2>&1 # django-cronjobs for project

显示定时任务列表

python3 manage.py crontab show

删除定时任务

python3 manage.py crontab remove b4564bdabd9dc

注意事项CRONJOBS 中配置的定时任务及所有参数不能有变量值,比如以下配置,在第二天时,不会再执行。

settings.py
CRONJOBS = [
('0 7 * * *', 'myapp.cron.scheduled_job', '>> %s' time.time())
]

因为,CRONJOBS 生成任务时,会生成对应的哈希值(hashes),标识每个任务。所以,当文件名变更时,CRONJOBS 中的值每天都在变化,导致不同的定时任务哈希值(hashes)。而系统 crontab 定时任务中的任务哈希值还是第一次执行 python3 manage.py crontab add 时的值

参考链接

django 定时任务 django-crontab 的使用
Linux crontab 命令