bash 로 작성된 스크립트의 경우 anacron 혹은 crond 에 의존하여 작동을 한다.
1 2 3 4 5 6 7 8 |
# Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed |
때문에 지정 할 수 있는 최소 시간은 1분이다.
즉 1분에 1회만 실행이 가능하다.
필요에 따라 5초 혹은 10초 단위 마다 재 실행 이 가능한 경우가 발생했다. (push 메세지 전송이라든가..)
이 한계를 넘기 위해 아래와 같이 작성하여 지정된 $TERM 동안 sleep 을 하고 excute-job 펑션을 재실행 하도록 작성 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#!/bin/bash ### shell overlab avoid (중복실행방지) lockfile=/var/lock/$(basename $0) if [ -f $lockfile ];then P=$(cat $lockfile) if [ -n "$(ps --no-headers -f $P)" ];then exit 1 fi;fi echo $$ > $lockfile trap 'rm -f "$lockfile"' EXIT ### CONFIG (1분안에 재 실행 횟수 지정) ### set 1 ~ 6 RETRY_A_MIN=6 ### FUNCTION (실제 실행할 프로세스) excute-job() { echo -ne "\r$(date)" } ### LOOP a MINUTE (간격 설정값에 따른 반복 실행) if [ $RETRY_A_MIN -eq 1 ];then TERM=51 elif [ $RETRY_A_MIN -eq 2 ];then TERM=26 elif [ $RETRY_A_MIN -eq 3 ];then TERM=17 elif [ $RETRY_A_MIN -eq 4 ];then TERM=13 elif [ $RETRY_A_MIN -eq 5 ];then TERM=11 else TERM=9;fi SHNOW=$(date +"%s") SHLIMIT=$(date +"%s" -d "50 secs") while [ $SHNOW -lt $SHLIMIT ] do ((RETRY_A_MIN--)) excute-job; if [ $RETRY_A_MIN -eq 0 ];then break 1 else sleep $TERM fi SHNOW=$(date +"%s") done echo unset SHNOW SHLIMIT exit 0 |
1~6 값을 지정함에 따라 알맞은 $TERM을 sleep 하고 재 실행 하게 된다.