最近的项目用到了定时执行的一些东西,但没有用到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
脚本的使用和功能基本上在程序里面都有阐述,不必多言,留在这里,以后参考!