NestJs의 CronJob
을 이용해 동적으로 태스크를 등록/해제하는 코드를 구현 후 우분투(오라클 클라우드) 서버에 도커 컨테이너를 띄우고 실행했다.
async insert() {
try {
const name = 'InsertJob';
const job = new CronJob('15 5,17 * * *', async () => {
this.logger.log(`Start Insert!`, job.lastDate());
await this.insertWeather();
});
this.schedulerRegistery.addCronJob(name, job);
} catch (e) {
this.logger.error(e);
this.insert(); // 에러 발생했을 경우 처음부터 재시도
}
}
한국시간(KST)으로 매일 오전 5시 15분, 오후 5시 15분 마다 태스크가 실행되는 코드이다.
중간에 디버깅 결과를 확인했더니 오전 혹은 오후 5시 15분에 시작되어야할 태스크가 한국시간 기준으로 오후 2시 15분에 시작된 것을 확인할 수 있었다.
이는 서버 시간이 UTC를 기준으로 설정되어있어 UTC기준 오전 5시 15분에 태스크가 실행되었던 것이다.
위 문제를 해결하기 위해 서버 시간을 한국시간으로 변경해줘야했다.
우분투 서버 시간대 KST으로 변경
$ date
Mon Feb 26 04:11:08 UTC 2024
date 명령어를 입력해 현재 시간을 확인해보았다.
위 결과와 같이 서버 시간대가 UTC로 설정되어있다는 것을 확인할 수 있었다.
아시아/서울 시간대로 변경하는 방법은 아래 링크를 참고했다.
https://syssurr.tistory.com/272
그러나 여전히 UTC시간대로 크론이 실행되고 있었다.
우분투 크론 서비스 KST시간 동기화
구글링을 좀 더 해본 결과, 서버 시간대를 변경하고 나왔을 때 크론의 시간대가 여전히 기존 시간대(UTC)로 남아있는 경우가 많다는 글을 보았다.
따라서 크론 서비스의 시간대를 KST로 변경하려면 크론 서비스를 재가동시키면 된다는 것이었다.
※ 여기서 cron 서비스는 일반적으로 리눅스 시스템에 기본적으로 설치되어있는 서비스라고 한다. (사용자가 새로 생성된 시스템X)
아래 명령어를 실행하여 크론 서비스를 재가동해보았다.
sudo /etc/init.d/cron restart
그러나 여전히 UTC시간대로 크론이 실행되고 있었다.
Docker 컨테이너 서버 시간 KST으로 변경
도대체 뭐가 문제일까 계속 고민하다가, 현재 크론을 사용하는 서비스는 도커 컨테이너로 실행되고 있다는 것을 생각해낸 후, 배포한 도커 컨테이너의 서버 시간대가 만약 UTC라면 이를 KST로 변경해주면 해결될 것 같았다.
docker exec -it [컨테이너 이름] bash
root@e0d8df4a396a:/app# date
Mon Feb 26 05:16:16 UTC 2024
컨테이너에 들어간 후 date
명령어를 입력했더니 역시나 서버 시간대가 UTC로 나와있었다.
따라서 Docekrfile에 아래와 같이 타임존을 추가한 후 다시 빌드했다.
FROM node:18.14.0
WORKDIR /app
COPY . .
RUN yarn install
ENV TZ Asia/Seoul
EXPOSE 3010
CMD ["yarn", "start:prod"]
다시 빌드된 컨테이너의 서버 시간대가 KST로 변경되었다.
오후 5시 15분에 태스크가 자동으로 실행되는 것을 보니 크론 시간도 KST로 잘 변경된 것 같았다.
※ 결과