
# /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