컴퓨터의 장점은 반복 작업을 불평 없이 약속된 시간에 수행한다는 것입니다.
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