定時任務腳本


最近的項目用到了定時執行的一些東西,但沒有用到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

腳本的使用和功能基本上在程序里面都有闡述,不必多言,留在這里,以后參考!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM