• 定时任务脚本


    最近的项目用到了定时执行的一些东西,但没有用到linux里面的功能,所以自己写了一个按时执行的调度程序

    # /bin/bash
    
    # whilerun.sh
    # writeby xingming on 2013年6月29日12:55:49
    # 常驻内存,循环执行脚本文件
    # 各参数含义介绍:
    # $1 为程序执行语句,将函数执行的参数等用引号引起来传进程序
    # $2 为待执行程序间隔执行时间,例 D1H2M3S4 代表一天两个小时三分钟四秒时间执行一次程序,DHMS先后无关
    # $3 为开始执行待执行程序的日期
    # $4 为开始执行待执行程序的时间
    # 如果$3 $4 不传递,程序默认从现在当前时间开始执行
    # 执行案例如:bash whilerun.sh "bash test.sh" s20h1 20130629 140000
    # 解释:从2013年6月29日14时开始,间隔时间为1小时20秒,执行程序test.sh
    # 如需后台执行,参考:bash -c "(bash whilerun.sh "bash test.sh" s10) &" > /dev/null 
    
    if [ $# -lt 1 ] ; then
        echo '# 各参数含义介绍:
    # $1 为程序执行语句,将函数执行的参数等用引号引起来传进程序
    # $2 为待执行程序间隔执行时间,例 D1H2M3S4 代表一天两个小时三分钟四秒时间执行一次程序,DHMS先后无关
    # $3 为开始执行待执行程序的日期
    # $4 为开始执行待执行程序的时间
    # 如果$3 $4 不传递,程序默认从现在当前时间开始执行
    # 执行案例如:bash whilerun.sh "bash test.sh" s20h1 20130629 140000
    # 解释:从2013年6月29日14时开始,间隔时间为1小时20秒,执行程序test.sh
    # 如需后台执行,参考:bash -c "(bash whilerun.sh "bash test.sh" s10) &" > /dev/null'
        exit
    fi
    
    # 获取每次执行的间隔时间
    timestep=`echo $2 | awk '
    {
        if(!match($0,"^([SsMmHhDd][0-9]+)+$"))
            print -1;
        else
        {
            timespan = 0;
            if(match($0,"[Ss][0-9]+"))
            {
                timespan += substr($0,RSTART+1,RLENGTH-1);
            }
            if(match($0,"[Mm][0-9]+"))
            {
                timespan += substr($0,RSTART+1,RLENGTH-1) * 60;
            }
            if(match($0,"[Hh][0-9]+"))
            {
                timespan += substr($0,RSTART+1,RLENGTH-1) * 60 * 60;
            }
            if(match($0,"[Dd][0-9]+"))
            {
                timespan += substr($0,RSTART+1,RLENGTH-1) * 60 * 60 * 24;
            }
            print timespan;
        }
    }'`
    
    if [ $timestep -eq -1 ] ; then
        echo '$2:'$2
        echo '$2 参数输入错误,无法解析'
        exit
    fi
    
    # 获取开始执行的时间
    if [ $# -ge 3 ] ; then
        dayspan=`date +%s -d $3 2> /dev/null`
        if [ "v"$dayspan == "v" ] ; then
            echo '$3 错误的输入!'"请输入正确的开始执行日期:$3"
            exit
        fi
        timespan=`echo $4 | awk '{
            timespan=0;
            hour = substr($1,1,2);
            mini = substr($1,3,2);
            sens = substr($1,5,2);
            if( length($1) != 6 || hour > 23 || hour < 0 ||
                    mini > 59 || mini < 0 || sens > 59 || sens < 0)
                print -1;
            else
                print timespan;}'`
        if [ $timespan -eq -1 ] ; then
            echo '$4 错误的输入!'"请输入正确的开始执行时间:$4"
            exit
        fi
    
        ((runtime=$dayspan+$timespan))
    else
        runtime=${3:-`date +%s`}
    fi
    
    sleeptime=`echo "($timestep/60)+1" | bc`
    
    echo "间隔执行程序时间为timestep :${timestep} S"
    echo "开始执行程序时间为runtime  :${runtime} S(`echo $runtime | awk '{print strftime("%Y-%m-%d %H:%M:%S",$0);}'`)"
    echo "检查执行时间间隔为sleeptime:${sleeptime} S"
    
    # 如果开始执行时间在很久之前,需要将runtime变为当前时间之后
    while [ 0$runtime -lt `date +%s` ] ; do
        ((runtime=$runtime+timestep))
    done
    
    # 开始执行while循环,检查程序执行时间
    while [ true ] ; do
        # 如果当前时间没有到达程序的执行时间,进入sleep状态
        while [ 0$runtime -gt `date +%s` ] ; do
            sleep $sleeptime
        done
    # 在此处执行程序
        echo "当前时间为:`date +"%Y-%m-%d %H:%M:%S"`;开始执行程序"
        $1
        ((runtime=$runtime+$timestep))
    done
    
    # 如果程序正常执行,此处无法运行到
    exit

    脚本的使用和功能基本上在程序里面都有阐述,不必多言,留在这里,以后参考!

  • 相关阅读:
    GoCN每日新闻(2019-11-03)
    GoCN每日新闻(2019-11-02)
    GoCN每日新闻(2019-11-01)
    GoCN每日新闻(2019-10-31)
    GoCN每日新闻(2019-10-30)
    GoCN每日新闻(2019-10-29)
    xms西软预定列表-房类市场
    GoCN每日新闻(2019-10-28)
    GoCN每日新闻(2019-10-27)
    GoCN每日新闻(2019-10-26)
  • 原文地址:https://www.cnblogs.com/pmars/p/3162511.html
Copyright © 2020-2023  润新知