Node.js App 실행을 스케줄링 하기

컴퓨터의 장점은 반복 작업을 불평 없이 약속된 시간에 수행한다는 것입니다.

Node.js로 구현한 App 역시 마찬가지로 지정된 시간마다 실행되도록 할 수 있습니다.


이번 포스트에서는 *nix(Linux, MacOS) OS를 기준으로

Node.js App을 스케줄링하는 두가지 방법을 공유합니다.



Cron?

*nix 시스템에는 기본적으로 cron scheduler가 탑재되어 있습니다.


cron 표현식에서 각 시간은 공백문자 한 개로 구분하며 아래와 같이 작성합니다.

# 분 시 일 월 요일 명령
0 10 * * * /sendMail.sh # 매일 오전 10시 정각에 sendMail.sh를 실행
30 14 * * 0 /nap.sh     # 매 일요일 오후 2시 30분에 nap.sh를 실행


이 글에서는 Cron 자체에 대해 다루는 것은 아니기에 표현식만 확인하고 넘어가도록 하겠습니다.

Cron에 대한 자세한 정보가 필요하다면 다음 글을 참고해주세요: Job Scheduler 크론 (Cron) 과 크론 표현식 - 가리사니



실행 후 종료되는 App: Cron

만약 반복적으로 실행할 App이 결과를 출력하고 종료되는 App이라면
시스템에 설치된 Cron을 이용하는 것이 적합합니다.


조금 복잡할 수 있지만 1분 마다 콘솔에 현재 시간을 출력하는 App을 실행하는 예제를 작성하겠습니다.


1. 터미널에 아래 명령어를 입력해서 현재 시간을 출력하는 JavaScript 코드를 저장하고, 확인합니다.

echo 'console.log(new Date());' > timestamp.js
cat timestamp.js

2. 터미널에 아래 명령어를 입력해서 timstamp.js를 실행하는 쉘 스크립트 코드를 저장하고, 실행을 확인합니다.

echo 'node ~/timestamp.js' > timestamp.sh
chmod +x timestamp.sh 
./timestamp.sh

3. 아래 명령어를 입력해서 Cron 설정 파일을 열고, 스크린샷과 같이 매 분 마다 timestamp.sh를 실행하는 명령을 추가합니다.

crontab -e

4. Ubuntu에서는 Cron 작업 실행 결과를 메일로 발송하고, 별도로 메일 주소가 설정되지 않았다면 로컬에 저장합니다. 몇 분 정도 지난 뒤에 Ubuntu를 기준으로 아래 명령어를 입력해서 실행 결과를 확인합니다.

cat /var/mail/<계정명>

중간중간에 10시 39분, 10시 40분에 실행된 결과를 확인할 수 있습니다.



항상 실행되어 있는 App: node-cron

이 포스트는 사실 이 파트를 위해 작성되었습니다.


pm2 등으로 항상 실행되어 있는 App에서

일정 시간마다 특정 함수를 사용해야 한다면 node-cron을 활용할 수 있습니다.


매 초 마다 현재 시간을 출력하고 종료되는 예제를 공유합니다.


1. 아래 명령어를 입력하여 node-cron을 설치합니다.

npm i --save cron


2. Sample Code: 아래 코드를 app.js로 저장합니다.

const CronJob = require('cron').CronJob;

const task = () => console.log(new Date()); // 현재 시간 출력
const stopAlert = () => console.log('Cron Stopped.'); // 정지 알림

// CronJob(Cron 표현식, 실행할 함수, 종료 시 실행할 함수, 자동 시작 여부, TimeZone);
const job = new CronJob('*/2 * * * * *', task, stopAlert, false, 'Asia/Seoul');

setTimeout(() => job.start()   ,  3000); // App 실행 3초 후 Cron 시작
setTimeout(() => job.stop()    , 13000); // Cron 시작 10초 후 Cron 정지
setTimeout(() => process.exit(), 15000); // Cron 정지 2초 후 App 종료


3. 아래 명령어를 입력하여 예제를 실행합니다.

node app.js



결론

일정 시간마다 실행 후 종료되어야 하는 App는 OS의 Cron을,

웹 서비스에서 최신 데이터를 적용하는 함수 등 일정 시간마다 실행되어야 하는 함수는 node-cron을,

상황에 따라 적합한 방법을 이용해서 Node.js App을 반복 실행할 수 있습니다.



GitHub

본 강의에 사용한 코드는 GitHub에 공개되어 있습니다.

https://github.com/jETA-Kor/examples



참고 문서

- Job Scheduler 크론 (Cron) 과 크론 표현식 - 가리사니: https://gs.saro.me/#!m=elec&jn=866

- npm - cron: https://www.npmjs.com/package/cron