개발/문제해결

pm2 Error: listen EADDRINUSE: address already 에러

ksc036 2026. 2. 2. 17:27

pm2를 사용하다 보면 이런 에러를 많이 마주친다.

 

특히 pm2 start npm --name service-name -- start 이런식으로 pm2 명령어로 npm을 실행하게 되면 자주 문제가 발생하였다. 

 

이 문제는 2가지 원인이 겹쳐서 발생하였다.

1. npm을 pm2로 실행하게 되면 해당 프로세스가 kill이 되면 port를 점유하고 있는 node 프로세스는 죽지않고 pm2에서 관리하는 npm 프로세스만 죽게된다.즉,  죽은 프로세스 != 포트를 점유하고 있는 프로세스가 되는 현상이 발생한다.

2. 나의 경우 프로세스 kill을 날리던 주체는 github action임을 밝혀졌다. 

pm2가 관리하는 프로세스가 node가 아니라 npm이 된다.
github action에서 프로세스 정

 

GitHub Actions Runner는 job이 종료될 때 다음 환경 변수를 기준으로 동작한다.

RUNNER_TRACKING_ID

이 환경 변수가 설정된 상태에서 실행된 프로세스는
job 종료 시 Runner가 자동으로 kill 신호를 보낸다.

 

여기서 중요한 점:

Runner가 kill하는 대상은 PM2가 관리 중인 프로세스

 

하지만 PM2가 관리하는 것은 node가 아니라 npm이다.

따라서 Runner는 npm을 죽이고,
node는 그대로 살아남아 고아 프로세스가 된다.

 

이 문제는 한동안 PM2 문제, 포트 문제, Next/Nest 문제로 오해되었다.

하지만 실제 원인은:

PM2 + npm 실행 방식 + GitHub Actions Runner의 kill 정책이 충돌한 것

이었다.

 

 

PM2는 반드시 Node 프로세스를 직접 관리하도록 하는게 좋은 것 같다.

'개발 > 문제해결' 카테고리의 다른 글

Hairpin NAT 문제 해결: 내부 DNS서버 운영  (0) 2025.10.12