• Linux_时间调度和时间变量


    调度方式

    定时调度:
        一次性调度
    	周期性调度: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
  • 相关阅读:
    简述 JPA 与 Spring Data JPA 与 Hibernate
    idea不识别yml配置文件,怎么办?
    Java 数组如何转成List集合
    git关于 LF 与 CRLF
    git报错:src refspec master does not match any
    蓝桥杯- 基础练习:十六进制转八进制
    蓝桥杯- 基础练习:数列排序
    蓝桥杯-入门训练 :A+B问题
    蓝桥杯-入门训练 :序列求和
    蓝桥杯-入门训练 :圆的面积
  • 原文地址:https://www.cnblogs.com/ytwang/p/16091820.html
Copyright © 2020-2023  润新知