调度方式
定时调度:
一次性调度
周期性调度:Cron表达式,用于配置Job如何周期性运行
依赖调度:
依赖条件 依赖策略
手动调度
调度器: Quartz
Linux调度-调度功能
文件位置
/etc/crontab
/etc/cron.d/*
/var/spool/cron/*
类型
system-wide crontab: cat /etc/crontab
user crontab: crontab -e
日志
#ls /var/log/cron*
sudo cat /var/log/cron | grep docker
服务管理
systemctl status cron (Ubuntu)
systemctl status crond (Centos)
Crontab表达式
当程序在你所指定的时间执行后,系统会发一封邮件给当前的用户,显示该程序执行的内容,
若是你不希望收到这样的邮件,请在每一行空一格之后加上 > /dev/null 2>&1 即可,
* * * * * docker container prune --filter "until=72h" -f > /dev/null 2>&1
* * * * * docker image prune -f > /dev/null 2>&1
第1列分钟1~59 第2列小时1~23(0表示子夜) 第3列日1~31 第4列月1~12 第5列星期0~6(0表示星期天)
Seconds Minutes Hours Day-of-Month Month Day-of-Week
第6列要运行的命令
*代表所有的取值范围内的数字,"/"代表每的意思,"/2"表示每2个单位,"-"代表从某个数字到某个数字,","分开几个离散的数字。
cron 是没有状态的,它不能够记录上次执行的是什么时间,只能根据当前的时间来判断是否需要执行
能够被整除的步长值才能表达与我们理解相一致确切的含义,
对于分钟来说只有 */2,*/3,*/4,*/5,*/6,*/10,*/12,*/15,*/30,
对于小时来说则只有*/2,*/3,*/4,*/6,*/8,*/12。
对于日期来说,如果使用*/5,则不能保证每5天执行一次,到月底的时候可能只执行1天、2天或3天后就停止了,这取决与大小月与平闰年
--在日志/var/log/cron里面,你可以看到定时任务的相关日志,然后就知道了这个作业的真实Schedule
每隔3天的9点执行
0 9 */3 * * docker container prune --filter "until=72h" -f > /dev/null 2>&1
因为第三位的*/3等同于1-31/3, crontab的天是相对于一个月来说的
也就是每个月第一天执行一次,然后第四天执行一次,第七天执行一次...以此类推
这样的话 对于每一个月来说,执行周期都是 1,4,7,10,13,16,19,22,25,28,31
/etc/crontab 编辑文件--语法
crontab -e这种所有用户都可以使用,普通用户也只能为自己设置计划任务
/etc/crontab这种方法只有root用户能用,这种方法更加方便与直接直接给其他用户设置计划任务,而且还可以指定执行shell等等,
/etc/crontab是系统的周期任务 /etc/crontab是个纯文本文件,可以root的身份编辑这个文件
分 时 日 月 周 用户 参数设定值 参数设定值 指令段
时间使用方式
将时间组合--赋值变量--变量替换相应的时间
脚本定时执行
Linux 中命令-date
1. 语法: date(选项)(参数) date 是指 linux 下的 GNU date
GNU date 的日期加减运算是支持自然语言的
-d 主要有三种指令:last/next指令 ago指令 负数指令
today=$(date +%Y-%m-%d)
yest=$(date -d "last-day $today" +%Y-%m-%d)
week=$(date -d"$yest-$((`date -d $yest +%u`-1)) days" +%Y-%m-%d)
today_s=$(date -d $today +%s000)
yest_s=$(date -d $yest +%s000)
week_s=$(date -d $week +%s000)
01.时间变动
yest_s=$(date -d $yest +%s000)
02.时间戳变动-可以得到过去的日期:
yest_s=$(date -d "1 hour ago $yest" +%s000)
yest_s=$(date -d "-1 hour ago $yest" +%s000)
03.前后顺序 以及 横杠加不加
yest_s=$(date -d "last hour $yest" +%s000)
yest_s=$(date -d "last-hour $yest" +%s000)
yest_s=$(date -d "next hour $yest" +%s000)
yest_s=$(date -d "next-hour $yest" +%s000)
yest_s=$(date -d "$yest last hour " +%s000)
2.时间格式变换
从时间戳变为日期格式
date -d @0 //当时间戳为0的时候,可以看到时间为 1970年08:00:00
date -d '@1498863660'
date -d '@1498863660' +%Y-%m-%d
date -d @1498863660 +"%Y-%m-%d %H:%M:%S"
从时间戳变为日期
shell将时间字符串与时间戳互转--+%s表示输出时间戳
date -d "$( date "+%Y-%m-%d %H:%M:%S")" +%s
date -d last-day +%s
date -d '2017-07-01 22:14' +%s
日期格式变换
date -d "2017-07-01" +"%Y/%m/%d %H:%M:%S"
3.今天日期--注意中间有空格
#对应昨天日期
date -d last-day +%Y-%m-%d
date -d 'last day' +%Y-%m-%d
#对应周的周一
date -d 'last monday' +"%Y-%m-%d"
#下周周一
date -d 'next monday' +"%Y-%m-%d"
date -d "last sunday" +"%Y%m%d
date +%w #获得当天是星期几
#今天本日期对应的月初日期
date +%Y%m01
date +%Y-%m-01
#今天对应的上个月月初
date -d '1 month ago' +%Y%m01
#本月月初
v_lm=`date +%Y%m01`
#上个月月末
v_lm_rq=`date -d "${v_lm} last day" +%Y%m%d`
echo ${v_lm_rq}
4.昨天-特定日期所对应的各个时间
date -d "yesterday" +%Y-%m-%d
yestD=`date -d "yesterday" +%Y%m%d`
echo ${yestD}
#昨天日期对应的月初日期
date -d '1 day ago' +%Y-%m-01
#昨天日期的周一
#写法01.昨天日期
v_yesterday=`date -d "yesterday" +%Y%m%d`
#昨天日期对应的周一的日期
v_lm_week=`date -d "${v_yesterday} last monday" +%Y-%m-%d`
echo ${v_lm_week}
#写法02.将当前日期赋值给DATE变量
DATEA=$(date -d "yesterday" +%Y%m%d)
date -d "${DATEA} last monday" +%Y-%m-%d
#写法03
#date -d " $(date -d "yesterday" +%Y%m%d) last monday" +%Y-%m-%d
Internet时间同步服务器地址(NTP时间服务器)
NTP服务器【Network Time Protocol(NTP)
时间同步
授时功能和定位功能-->定位授时系统
硬件上把时钟源统一
时钟源的累计误差--时间差 累计漂移
传感器的采集时刻-->索引和插值计算
考虑一些异常情况,传感器难免会有一些丢帧或者时间戳出问题的情况
海量数据本身就有一种吸引力,更何况处理这些数据可以对社会和人民有帮助
参考
从零开始做自动驾驶定位(六): 传感器时间同步 https://zhuanlan.zhihu.com/p/108853312