定时任务脚本

最近的项目用到了定时执行的一些东西,但没有用到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

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

posted @ 2013-06-29 16:51  pmars  阅读(3480)  评论(0编辑  收藏  举报