0、基本概念 & 实现原理python
定时任务基本概念:linux
a、从有无状态来讲,有如下两种:数据库
有状态任务:每次执行的任务是同一个实例,不能被并行执行;若是该任务的执行时间超过下次触发的时刻,那么下次的触发将不会有做用。好比,一个有状态任务执行时间是5分钟,它的间隔时间是3分钟;若是正在执行的时候,下次触发时刻到达,则不会被执行。api
无状态任务:每次执行任务都是一个新的实例,能够并行执行。缓存
b、从执行的任务类型来讲,有如下三种:bash
SCA服务任务:任务是一个SCA服务。服务器
逻辑流任务:任务是一个逻辑流。并发
任意方法任务:任务是一个方法。app
c、触发模式(触发器):用于定义任务调度的时间规则,主要有下面两种:负载均衡
固定时刻触发(简单触发器):通常用于实现间隔固定的时间执行任务,以及重复多少次,如每 2 小时执行一次,重复执行 5 次。
日历周期触发(复杂触发器):使用Unix 'cron-like'表达式来定义时间规则,即利用一个包含 7 个字段的表达式来表示时间调度方式。例如,"0 15 10 * * ? *" 表示天天的 10:15AM 执行任务。对于涉及到星期和月份的调度比较合适。
d、错失触发:定时任务若是错过触发而没有执行,好比系统中止;系统重启后,就会针对错失触发的定时任务进行处理,通常有两种错失触发策略(EOS_QRTZ_TRIGGERS表的MISFIRE_INSTR字段):
当即从新触发:默认策略,当即执行一次定时任务,而无论错过几回。MISFIRE_INSTR字段值为1。
错过触发:下次触发时间到来,再触发执行定时任务。MISFIRE_INSTR字段值为2。
定时任务配置界面以下:
定时任务的实现:
注: 若是是集群模式,则要求每一个节点的时钟必定要一致,不然将发生没法预料的问题。建议简单触发器的间隔时间不要小于20秒。
Cron 是一个linux下的定时执行工具,也是Linux的内置服务,能够在不用人工干预的状况下运行做业。
/sbin/service crond start # 启动服务
/sbin/service crond stop # 关闭服务
/sbin/service crond restart # 重启服务
/sbin/service crond reload # 从新载入配置
在 /etc/rc.d/rc.local 这个脚本的末尾加上: /sbin/service crond start 那么Cron这个服务就已经在进程里面了,咱们就能够用这个服务了。
Cron提供的接口:
使用crontab命令编辑, cron服务提供crontab命令来设定cron服务的,参数说明:
crontab -u # 设定某个用户的cron服务,通常root用户在执行这个命令的时候须要此参数
crontab -l # 列出某个用户cron服务的详细内容
crontab -r # 删除每一个用户的cron服务
crontab -e # 编辑某个用户的cron服务
root查看本身的cron设置: crontab -u root -l
root删除fred的cron设置: crontab -u fred -r
编辑cron服务的格式和约定: crontab -u root -e
进入vi编辑模式: */1 * * * * ls >> /tmp/ls.txt
crontab命令选项:
-u 指定一个用户,
-l 列出某个用户的任务计划,
-r 删除某个用户的任务,
-e 编辑某个用户的任务
任务调度的crond常驻命令:crond 是linux用来按期执行程序的命令。操做系统安装完成以后,默认会启动此任务的调度命令。crond命令每分锺会按期检查是否有要执行的工做,若是有要执行的工做便会自动执行该工做。
Linux任务调度的工做主要分为如下两类:
cron服务每分钟不只要读一次 /var/spool/cron 内的全部文件,还须要读一次 /etc/crontab ,所以咱们配置这个文件也能运用cron服务作一些事情。用crontab配置是针对某个用户的,而编辑 /etc/crontab 是针对系统的任务。
原理解析
Cron服务是由 守护进程crond和一组crontab文件 组成。crond守护进程是在系统启动时由init进程启动的,受init进程的监视,若是它不存在了,会被init进程从新启动。这个守护进程每分钟唤醒一次,并经过检查crontab文件(任务表)判断须要执行什么任务。每一个用户有一个以用户名命名的crontab文件,存放在 /var/spool/cron/crontabs 目录里。若管理员容许或者禁止其余用户拥有crontab文件,则应编辑 /etc/cron.deny 和 etc/cron.allow 这两个文件来禁止或容许用户拥有本身的 crontab文件。(每个用户均可以有本身的crontab文件,但在一个较大的系统中,系统管理员通常会禁止这些文件,而只在整个系统保留一个这样的文件)
crontab其实是启动服务后读取全部配置文件,而后睡眠一分钟以后运行下一个任务,crontab服务启动后,会检查 /var/spool/cron/tabs 下全部用户的定时任务,而后加载到内存的队列中,而后每分钟检查一下 crontab文件是否有改动。能够理解为cron服务有2个线程,一个是调度处理定时任务,一个后台线程,后台线程检查配置文件是否有变更,若是有变更,则发送信号到调度进程,调度进程再从新读取配置文件更新内存中的任务队列,同理,service cron stop 也是发信号到cron服务(本次确认cron服务半僵死就是由于没法响应了)致使调度线程不知道变更,没有更新内存中的队列。从 /var/log/messages 观察,依然是修改或删除以前的定时任务在运行。 所以,为了保险,在用户里 crontab -r 删除用户的定时任务后,建议重启一下crontab服务(service cron stop后记得service cron status 查看一下是否中止成功,若是没有 kill -9 再 service cron start),也就是清空一下当前定时任务的内存队列,让cron服务从新加载,更重要的是防止cron服务挂住没从新加载定时任务队列。
3.cron文件语法:
分 小时 日 月 星期 命令
0-59 0-23 1-31 1-12 0-6 command (取值范围,0表示周日通常一行对应一个任务)
4.记住几个特殊符号的含义:
"*" 表明取值范围内的数字,
"/" 表明"每",
"-" 表明从某个数字到某个数字,
"," 分开几个离散的数字 1、任务调度设置文件的写法 可用crontab -e命令来编辑,编辑的是/var/spool/cron下对应用户的cron文件,也能够直接修改/etc/crontab文件 具体格式以下:
Minute Hour Day Month Dayofweek command
分钟 小时 天 月 天每星期 命令 每一个字段表明的含义以下:
Minute 每一个小时的第几分钟执行该任务
Hour 天天的第几个小时执行该任务
Day 每个月的第几天执行该任务
Month 每一年的第几个月执行该任务
DayOfWeek 每周的第几天执行该任务
Command 指定要执行的程序 在这些字段里,除了“Command”是每次都必须指定的字段之外,其它字段皆为可选字段,可视须要决定。对于不指定的字段,要用“*”来填补其位置。 举例以下:
5 * * * * ls 指定每小时的第5分钟执行一次ls命令
30 5 * * * ls 指定天天的 5:30 执行ls命令
30 7 8 * * ls 指定每个月8号的7:30分执行ls命令
30 5 8 6 * ls 指定每一年的6月8日5:30执行ls命令
30 6 * * 0 ls 指定每星期日的6:30执行ls命令[注:0表示星期天,1表示星期1,以此类推,也能够用英文来表示,sun表示星期天,mon表示星期一等。]
30 3 10,20 * * ls 每个月10号及20号的3:30执行ls命令[注:“,”用来链接多个不连续的时段]
25 8-11 * * * ls 天天8-11点的第25分钟执行ls命令[注:“-”用来链接连续的时段]
*/15 * * * * ls 每15分钟执行一次ls命令 [即每一个小时的第0 15 30 45 60分钟执行ls命令 ]
30 6 */10 * * ls 每月中,每隔10天6:30执行一次ls命令[即每个月的一、十一、2一、31日是的6:30执行一次ls命令。 ]
天天7:50以root 身份执行/etc/cron.daily目录中的全部可执行文件
50 7 * * * root run-parts /etc/cron.daily [ 注:run-parts参数表示,执行后面目录中的全部可执行文件。 ]
2、新增调度任务 新增调度任务可用两种方法:
一、在命令行输入: crontab -e 而后添加相应的任务,wq存盘退出。
二、直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务。 3、查看调度任务
crontab -l //列出当前的全部调度任务
crontab -l -u jp //列出用户jp的全部调度任务 4、删除任务调度工做
crontab -r //删除全部任务调度工做 5、任务调度执行结果的转向 例1:天天5:30执行ls命令,并把结果输出到/jp/test文件中
30 5 * * * ls >/jp/test 2>&1
注:2>&1 表示执行结果及错误信息。 编辑/etc/crontab 文件配置cron
系统任务格式:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root //若是出现错误,或者有数据输出,数据做为邮件发给这个账号 HOME=/ //使用者运行的路径,这里是根目录
# run-parts
01 * * * * root run-parts /etc/cron.hourly
//每小时执行/etc/cron.hourly内的脚本
02 4 * * * root run-parts /etc/cron.daily
//天天执行/etc/cron.daily内的脚本
22 4 * * 0 root run-parts /etc/cron.weekly
//每星期执行/etc/cron.weekly内的脚本
42 4 1 * * root run-parts /etc/cron.monthly
//每个月去执行/etc/cron.monthly内的脚本
你们注意"run-parts"这个参数了,若是去掉这个参数的话,后面就能够写要运行的某个脚本名,而不是文件夹名了
例如:
一、在命令行输入: crontab -e 而后添加相应的任务,wq存盘退出。
二、直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务
11 2 21 10 * rm -rf /mnt/fb
1、相关配置
2、经常使用命令:
crontab [-u username] // 省略用户表表示操做当前用户的crontab -e (编辑工做表) -l (列出工做表里的命令) -r (删除工做)
crontab -e 进入当前用户的工做表编辑,crontab的命令构成为‘时间+动做’,其时间有分、时、日、月、周五种,操做符有:
3、crontab时间说明
# .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR # | | | | | # | | | | | # * * * * * command to be executed minute:表明一小时内的第几分,范围 0-59。 hour:表明一天中的第几小时,范围 0-23。 mday:表明一个月中的第几天,范围 1-31。 month:表明一年中第几个月,范围 1-12。 wday:表明星期几,范围 0-7 (0及7都是星期天)。 who:要使用什么身份执行该指令,当您使用 crontab -e 时,没必要加此字段。 command:所要执行的指令。
4、crontab服务状态
sudo service crond start # 启动服务 sudo service crond stop # 关闭服务 sudo service crond restart # 重启服务 sudo service crond reload # 从新载入配置 sudo service crond status # 查看服务状态
5、crontab命令
crontab $filepath # 从新指定crontab定时任务列表文件 crontab -l # 查看crontab定时任务 crontab -e # 编辑定时任务【删除-添加-修改】 # 添加定时任务 Step-One : 编辑任务脚本【分目录存放】【ex: backup.sh】 Step-Two : 编辑定时文件【命名规则:backup.cron】 Step-Three : crontab命令添加到系统crontab backup.cron Step-Four : 查看crontab列表 crontab -l
6、实例
# 实例1:每1分钟执行一次myCommand * * * * * myCommand # 实例2:每小时的第3和第15分钟执行 3,15 * * * * myCommand # 实例3:在上午8点到11点的第3和第15分钟执行 3,15 8-11 * * * myCommand # 实例4:每隔两天的上午8点到11点的第3和第15分钟执行 3,15 8-11 */2 * * myCommand # 实例5:每周一上午8点到11点的第3和第15分钟执行 3,15 8-11 * * 1 myCommand # 实例6:每晚的21:30重启smb 30 21 * * * /etc/init.d/smb restart # 实例7:每个月一、十、22日的4 : 45重启smb 45 4 1,10,22 * * /etc/init.d/smb restart # 实例8:每周6、周日的1 : 10重启smb 10 1 * * 6,0 /etc/init.d/smb restart # 实例9:天天18 : 00至23 : 00之间每隔30分钟重启smb 0,30 18-23 * * * /etc/init.d/smb restart # 实例10:每星期六的晚上11 : 00 pm重启smb 0 23 * * 6 /etc/init.d/smb restart # 实例11:每一小时重启smb * */1 * * * /etc/init.d/smb restart # 实例12:晚上11点到早上7点之间,每隔一小时重启smb * 23-7/1 * * * /etc/init.d/smb restart # 天天早上6点 0 6 * * * echo "Good morning." >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,由于cron把任何输出都email到root的信箱了。 # 每两个小时 0 */2 * * * echo "Have a break now." >> /tmp/test.txt # 晚上11点到早上8点之间每两个小时和早上八点 0 23-7/2,8 * * * echo "Have a good dream" >> /tmp/test.txt # 每月的4号和每一个礼拜的礼拜一到礼拜三的早上11点 0 11 4 * 1-3 command line # 1月1日早上4点 0 4 1 1 * command line SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root //若是出现错误,或者有数据输出,数据做为邮件发给这个账号 HOME=/ # 每小时(第一分钟)执行/etc/cron.hourly内的脚本 01 * * * * root run-parts /etc/cron.hourly # 天天(凌晨4:02)执行/etc/cron.daily内的脚本 02 4 * * * root run-parts /etc/cron.daily # 每星期(周日凌晨4:22)执行/etc/cron.weekly内的脚本 22 4 * * 0 root run-parts /etc/cron.weekly # 每个月(1号凌晨4:42)去执行/etc/cron.monthly内的脚本 42 4 1 * * root run-parts /etc/cron.monthly # 注意: "run-parts"这个参数了,若是去掉这个参数的话,后面就能够写要运行的某个脚本名,而不是文件夹名。 # 天天的下午4点、5点、6点的5 min、15 min、25 min、35 min、45 min、55 min时执行命令。 5,15,25,35,45,55 16,17,18 * * * command # 每周一,三,五的下午3:00系统进入维护状态,从新启动系统。 00 15 * *1,3,5 shutdown -r +5 # 每小时的10分,40分执行用户目录下的innd/bbslin这个指令: 10,40 * * * * innd/bbslink # 每小时的1分执行用户目录下的bin/account这个指令: 1 * * * * bin/account # 天天早晨三点二十分执行用户目录下以下所示的两个指令(每一个指令以;分隔): 203 * * * (/bin/rm -f expire.ls logins.bad;bin/expire$#@62;expire.1st)
7、Django中的定时任务
# 添加定时任务到系统中 python manage.py crontab add # 显示已经激活的定时任务 python manage.py crontab show # 移除定时任务 python manage.py crontab remove