问题点
我使用Docker部署项目,启动的crontab的时候并未生效,添加定时任务时提示:/usr/bin/crontab not found
基本使用
- django默认不带定时任务的功能,本文使用django-crontab插件实现定时任务。
$ pip install django-crontab
- settings中配置
INSTALLED_APPS = (
'django_crontab',
)
- 创建定时任务
# myapp/cron.py
def my_scheduled_job():
pass
- 把定时任务添加到settings
CRONJOBS = [
('23 59 * * *', 'myapp.cron.my_scheduled_job')
]
- 定时任务的时间格式
基本格式 :
* * * * *
分 时 日 月 周 命令
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
"""
- 解决中文字符问题
# 在settings中添加
CRONTAB_COMMAND_PREFIX = 'LANG_ALL=zh_cn.UTF-8'
- 注册定时任务
python manage.py crontab add
- 显示定时任务
$ python manage.py crontab show
- 移除定时任务
$ python manage.py crontab remove
在Docker中使用
时区问题
- 查看时间
date
- 修改系统时间(在Docker中操作)
# 第一项选择Asia,然后选择China,BeijingTime,完成后一定要重启容器
tzselect
缺少cron
- docker的容器中需要有crom服务,django-crontab依赖它,进入到容器中安装
# 安装cron
apt-get -y install cron
# 启动cron
service cron start
# 在项目目录下添加定时任务
python manage.py crontab add
# 查看启动的定时任务
python manage.py crontab show