cron 은 분 단위로 스케줄링하기 때문에 초 단위 스케줄링하려면 약간의 꽁수가 필요합니다.

스크립트에서 sleep 실행

먼저 다음과 같이 초 단위로 스케줄링할 실행할 명령어(run-every-x-seconds.sh)를 crontab 에 등록합니다.

crontab 설정

* * * * * /home/ec2-user/gist/run-every-x-seconds.sh
BASH


초 단위로 실행하려면 스크립트에서 loop 를 돌면서 주기적으로 sleep 후에 명령어를 실행하면 됩니다.

아래는 5초마다 echo 로 실행 시간을 출력하는 예제입니다.

run-every-x-seconds.sh

#!/usr/bin/env bash

SLEEP_SECOND=5

function some_task {
    echo $(date "+%Y-%m-%d %H:%M:%S") ;
}

for i in $(seq -s " " 1 ${SLEEP_SECOND} 60);do
    some_task
    sleep ${SLEEP_SECOND};
done
BASH


위 예에서 실행한 echo 구문은 지연될만한 요소가 없으므로 지정한 시간마다 실행되겠지만 만약 오래 걸리는 명령어를 실행한다면 "실행 시간" + "sleep 시간" 만큼 지연이 발생하게 됩니다.


만약 오래 걸리는 명령어라면 back ground 로 실행해 주면 됩니다.

run-every-x-seconds.sh

#!/usr/bin/env bash

SLEEP_SECOND=5

function some_task {
    echo $(date "+%Y-%m-%d %H:%M:%S") ;
}

for i in $(seq -s " " 1 ${SLEEP_SECOND} 60);do
    some_task &
    sleep ${SLEEP_SECOND};
done
BASH

중복 실행 방지

위 스크립트가 실행중일 때 1분이 지나면 다시 cron 에 의해 새로운 스크립트가 실행됩니다.

이를 방지하려면 실행 여부를 나타내는 파일을 하나 만들고 실행시 체크하면 됩니다.

위 gist 는 "중복 실행" 방지가 되지 않는 문제가 있습니다.


같이 보기


Ref