Friday, December 14, 2012

讓 cron 可以每隔幾秒執行 shell script

之前使用每五分鐘檢查是否有嘗試入侵的機器, 發現有些機器會一下送來一堆連線. 所以只好將執行時間降到以秒為單位. 由於檢查用的 shell script 約在幾秒內完成, 所以就用下列的 shell script 來達成.
cronjobs_in_seconds.sh

#!/usr/local/bin/bash

PATH=$PATH

TIMES=`date +"%s"`
LOGFILE="/tmp/CRONJOBS-$TIMES-"

CHKPARA=0

if [ -n "$1" ]; then
        WAITTIME="$1"
        shift
else
        CHKPARA=1
fi

if [ -n "$1" ]; then
        SCRIPTNAME="$1"
        shift
else
        CHKPARA=1
fi

if [ ! -f $SCRIPTNAME ]; then
        echo "Script file $SCRIPTNAME does not existed."
        exit 1
fi

case $WAITTIME in
RANDOM|random)  SLEEPSECS=$((RANDOM%60+1))
                ;;
*)              SLEEPSECS=$WAITTIME
                ;;
esac

if [ $CHKPARA -eq 1 ]; then
        echo "Usage: $0 SleepSeconds|RANDOM /Path/to/Script_Name"
        echo "Example: $0 15 /root/root_scripts/authlog_banip.sh"
        echo "         $0 random /root/root_scripts/authlog_banip.sh"
        exit 1
else
        RUNS=`expr 60 / $SLEEPSECS`
        RUNLIMIT=`expr 1 + $RUNS`
        LOGFILE="$LOGFILE"`md5 $SCRIPTNAME | awk '{print $4}'`

        touch $LOGFILE
        for((run=$RUNS; run > 0; run--)); do
                echo "$SCRIPTNAME $WAITTIME seconds - run "`expr $RUNLIMIT - $run` >> $LOGFILE
                $SCRIPTNAME >> $LOGFILE
                echo "====================================" >> $LOGFILE

                if [ $run -gt 1 ]; then
                        sleep $SLEEPSECS
                fi
        done
        rm -f $LOGFILE
fi
/etc/crontab
*       *       *       *       *       root    /Path/to/cronjobs_in_seconds.sh 10 /Path/to/authlog_banip.sh > /dev/null 2>&1

No comments: