Developer/Posting

Node.js: PM2 사용 시 Cronjob 설정

codingzipsa 2022. 9. 24. 22:53
반응형

node.js(with typescript)로 구현한 크롤러의 정기적인 동작 구현을 위해 여러 방안을 생각했다.

 

1. OS (우분투)에서 지원하는 Crontab을 이용하여 시작점인 index.js 정기적인 실행

2. PM2 이용, 실행

3. 스케쥴링 라이브러리인 노드 스케쥴러를 활용한 실행

 

첫번째는 이전에 해본 내용이기도 하고 Node 기반으로 진행할 시 2, 3번이 더 좋을 것 같아서 두개 자료를 보면서 파악을 해보았다.

현재 코드 구조 상 해당 크롤링 서버가 동작이 계속 되고 있는 상황에서 트리거로서 크론잡을 이용해도 되고, 아니라면 서버를 띄워놓지 않은 상황에서 시작점을 호출하여 서버 동작하고 종료하게 할 수 있는 두가지 갈림길에 서있었다.

 

PM2에서 크론잡을 세팅하는 방법은 크게 두가지가 있다.

 

1. EcoSystem을 활용한 크론잡 세팅

에코시스템을 활용하여 PM2 시작 시 해당 설정을 불러오게 하여 쓰는 방법이다. 이전에 노드 기반 서버 구축 시 해당 내용으로 개발/상용계를 분리하였기에 조금 친숙한 설정이긴 하다.

https://pm2.keymetrics.io/docs/usage/application-declaration/

 

PM2 - Ecosystem File

Advanced process manager for production Node.js applications. Load balancer, logs facility, startup script, micro service management, at a glance.

pm2.keymetrics.io

module.exports = {
  apps : [{
    name        : "Crawler",
    script      : "./index.js",
    cron_restart: "* * * * *",
    watch       : true,
  }]
}

 

2. PM2 실행스크립트에 크론 flag 사용

내가 작업한 내용은 개발/상용계가 굳이 분리되지 않아도 되기에 위 에코시스템은 간편하긴 하지만 더욱 간편한 flag사용을 해보면서 사용방법을 다양하게 습득해보고자 했다.

 

pm2 start index.js --cron "* * * * *"

단순하게 --cron flag를 기존 실행명령어 뒤에 넣어주면 간단하게 설정이 된다라고 쓰려고 했으나...! 위와 같이 스크립트를 쓰게되면 일단 한번 실행하고 다음 예약된 시간대에 작동이 된다!

 

이는 내가 전혀 의도치 않았던 부분이라 좀 당황을 하여 해결할 수 있는 방안을 이리저리 뒤지다 보니 PM2에 --no-autorestart라는 flag가 존재하였다.

pm2 start index.js --no-autorestart --cron "* * * * *"

EcoSystem을 사용한다면 아래와 같이 "autorestart": false 옵션을 넣어주면 된다.

module.exports = {
  apps : [{
    name        : "Crawler",
    script      : "./index.js",
    cron_restart: "* * * * *",
    watch       : true,
    "autorestart" : false
  }]
}

이렇게 넣어주게 되면 PM2는 초기에 실행하지 않고 크론에 정의된 시간대부터 실행을 하게되고, 특히, 한번 실행이 끝난 이후 재실행을 하지 않는, 즉, 단일 실행을 하고 종료가 되게 된다. 내 경우는 일주일에 한번(테스트 시 하루에 한번) 돌려야되었기 때문에 해당 flag를 넣어 의도된대로 잘 진행하고 있다!

 

 

반응형