cron 에서 초 단위로 스케줄링하기
cron 은 분 단위로 스케줄링하기 때문에 초 단위 스케줄링하려면 약간의 꽁수가 필요합니다.
스크립트에서 sleep 실행
먼저 다음과 같이 초 단위로 스케줄링할 실행할 명령어(run-every-x-seconds.sh)를 crontab 에 등록합니다.
crontab 설정
* * * * * /home/ec2-user/gist/run-every-x-seconds.sh
초 단위로 실행하려면 스크립트에서 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
위 예에서 실행한 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
중복 실행 방지
위 스크립트가 실행중일 때 1분이 지나면 다시 cron 에 의해 새로운 스크립트가 실행됩니다.
이를 방지하려면 실행 여부를 나타내는 파일을 하나 만들고 실행시 체크하면 됩니다.
위 gist 는 "중복 실행" 방지가 되지 않는 문제가 있습니다.
같이 보기
Ref
- https://mingrammer.com/scheduling-cron-job-in-seconds-interval/
- https://stackoverflow.com/questions/9619362/running-a-cron-every-30-seconds