Unix

pm2-yacron 조합

ForceCore 2023. 1. 30. 11:10

유저 레벨에서 계속 실행되는 서비스를 관리할 때에는 이제 systemctl --user 보다는 pm2가 더 편한 툴로 생각된다. 슬슬 갈아타고있다. resilios sync라든지...

 

하지만 cron으로 돌리던 주기작업의 경우는 어떤가? pm2가 주기작업은 좀 별로인 것 같다. 실행이 안 되는 때도 있다 이상하게. 그리고 pm2 ls를 쳐보면 stopped로 뜨는 것도 마음에 안 든다.

 

cron은 logging이 잘 안 되기도 하고 (잘 되는데 syslog로 들어간다든지해서...) notification을 보낸다든지 하는 부분이 이메일로 간다든지해서 영 별로임.

 

https://pypi.org/project/yacron/

 

yacron

A modern Cron replacement that is Docker-friendly

pypi.org

yacron을 추천함. 다만 얘는 데몬이라서 누군가가 실행을 해야 하는데... 그 누군가가 pm2가 되면 조합이 좋은 듯. yacron은 docker/kubernetes 를 염두에두고 새로 만든 것이라고 함.

 

pm2 ecosystem 설정

module.exports = {
  apps : [{
    name : "yacron",
    namespace : "daemon",
    interpreter : "/home/ubuntu/venv-3.9/bin/python",
    script : "/home/ubuntu/venv-3.9/bin/yacron",
    args : ["-c", "/home/ubuntu/pm2/yacrontab.yaml"],
    time : true,
  }]
}

시작은 pm2 start ecosystem.config.js --only=yacron 이런 식으로 해주면 된다. yacron 데몬을 한 개만 띄우란 법도 없으니 태스크가 너무 많다고 생각되면 태스크를 몇 개의 그룹으로 나눠서 데몬도 여럿 띄우면 나중에 로그 볼 때 도움이 될 것이다.

yacrontab이 crontab 에 해당하는 것이다. 파일 이름은 반드시 ecosystem.config.js 로 해야함.

 

yacrontab구성

# These jobs are run by yacron, which in turn is run by pm2!

defaults:
  captureStderr: true
  captureStdout: true
  streamPrefix: "[{job_name}] "  # 로깅할 때 jobname을 앞에 붙여서 나중에 어느 태스크가 뿌린 메시지인지 추적 가능하게
  failsWhen:
    producesStdout: false
    producesStderr: false
    nonzeroReturn: true
    always: false
  onFailure:
    report:
      shell:  # 실패시 이 shell program 실행 (이 경우는 슬랙으로 메시지 보내기 스크립트)
        shell: /bin/bash
        # YACRON_JOB_NAME 변수에 어느 job인지 저장되어있음. 기타 변수는 yacron 프로젝트 홈페이지 참고
        command: /usr/local/bin/slack_send_cron.sh "[yacron] job=$YACRON_JOB_NAME failed, see pm2 log for yacron for details"

jobs:
  - name: calc_checksum
    command: /home/ubuntu/git/gateway/calc_checksum.sh
    shell: /bin/bash
    schedule: "31 * * * *"
    # concurrencyPolicy: Forbid

 

defaults 부분이 customization이 필요한 경우가 있어서 이것도 여기 예제로 붙여둠.

 

이후 yacrontab 이 변경되면 `pm2 restart yacron` 해주면 됨. onFailure는 여러가지를 지원하므로 yacron 프로젝트 홈페이지에 들어가서 매뉴얼을 보자. 이메일도 있고 클라우드 로깅 서비스도 있음.