systemd에 pm2를 등록하는 방법은 간단하다.
pm2에서 제공되는 커맨드인 startup을 이용하면 바로 등록된다.
$ pm2 startup
이렇게 하고 공식문서에 쓰여진 대로 하면 되는 것 같다.
https://pm2.io/docs/runtime/guide/startup-hook/
그런데 내 경우는 docker 내부에서 위 명령어를 수행했다.
docker는 기본적으로 root로 실행되기 때문에 위 문서에 나온 sudo 어쩌구 하는 명령어가 안나오고 모든 과정이 자동으로 샐행되었다. 문제는 이 상태로는 systemctl start 가 실패했다.
잘 살펴보니 pm2 startup을 실행해서 자동생성된 service 파일의 User 부분이 undefine로 되어 있었다.
undefine -> root 로 바꾸니 해결되었다.
애초에 이를 옵션을 줘서 다음과 같이 해결한다.
$ pm2 startup -u <user> --service-name myapp
<user>에 pm2 프로세스를 실행하는 유저 이름을 myapp은 systemd에 등록될 서비스이름이 된다.
그리고 추가 작업으로 pm2 save로 현재 실행 중인 pm2 프로세스 리스트를 덤프(/root/.pm2/dump.pm2)한 뒤 docker를 재실행 해 본다.
그러면 systemd에서 위에서 만든 서비스를 실행한다. 이 실행은 pm2 resurrect로 덤프된 pm2 프로세스들을 실행하는 작업이다.
참고로 docker에서 systemd사용이 기본적으로 금지된다. 추가작업이 필요한데 이 것은 인터넷을 찾아보면 잘 나와있다.
추가: 간혹 pm2 start가 실패할 경우가 있다. 재시작 관련 옵션을 따로 주지 않으면 pm2는 재시작을 한다.
문제는 재실패 시 또 재시작을 하고, 이런 과정이 무한 반복된다. 필자의 경우 재시작 옵션을 주지 않고 있었고, 개발 서버이기 때문에 특별히 체크하지 않고 다른일을 하고 있었으므로 무한 반복은 3일동안 계속되었다.
나중에 발견할 당시 pm2가 cpu 사용율 400%를 잡아먹고 있었다.
따라서 다음 옵션을 필수로 해야할 듯 싶다.
--restart-delay=3000 --max-restarts=5