arrow_upward
본문 바로가기
DevOps

cron 배치 작업 시 중복 실행 문제 방지

by dawncode 2024. 10. 7.

실시간 쌓이는 로그를 cron을 사용해서 스케줄링 할 때 curl로 호출한 API가 중복으로 호출되어 실행되는 문제가 있었다.


cron 스케줄링은 crontab에 설정한대로 매 분마다 배치 스크립트 파일을 실행한다.

문제는 API를 호출해서 로그를 처리하는 작업이 쌓인 로그의 양에 따라서 트래픽이 적을 때는 1분 이내로 끝날 수 있다.

하지만 트래픽이 많아서 로그가 많이 쌓이면 처리시간이 1분 이상 걸리면서 배치 주기를 보다 작업이 길어지면서, 이전 배치작업이 끝나지 않았는데 스케줄링에 의해 다음 작업이 호출돼 API가 중복 호출되는 문제가 있었다.

 

crontab

* * * * * /home/test/log/batch.sh

 

batch.sh

#!/bin/bash

# 배치 API 호출
/usr/bin/curl -s "http://www.test.com/api/log/batch"



 

중복 실행 방지 스크립트 작성

서버에서 로그를 배치작업을 하는 API가 배치주기보다 오래 걸리는 문제를 방지하기 위해 락파일을 하나 정의하고 락파일을 체크하는 로직을 통해 진행중인 배치 작업이 있으면 쉘을 종료하도록 구현해줬다.

#!/bin/bash

# lock 파일 경로
LOCK_FILE="/home/test/log/batch.lock"

if [ -e "$LOCK_FILE" ]; then
    exit 1
fi

# lock 파일 생성
touch "$LOCK_FILE"

# 배치 API 호출
/usr/bin/curl -s "http://www.test.com/api/log/batch"

# 배치 작업 후 lock 파일 제거
rm -f "$LOCK_FILE"

 

스크립트 파일에 lock 파일을 체크하는 로직을 추가했다.

cron 스케줄링에 의해 배치가 실행되며 api 시작 전 lock 파일을 생성하고, 서버의 API 작업이 끝나지 않으면 lock 파일은 제거되지 않았기 때문에, 다음 스케줄링으로 쉘이 실행되도 lock 파일이 존재하기 때문에 스크립트는 종료되게 된다.