最近的項目用到了定時執行的一些東西,但沒有用到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
腳本的使用和功能基本上在程序里面都有闡述,不必多言,留在這里,以后參考!
