Error: listen EADDRINUSE: address already in use :::3000 at Server.setupListenHandle [as _listen2] 오류 해결법

allzeroyou·2022년 1월 24일
2

🎁 오류 잡자

목록 보기
1/3

1. 문제 발생

상황

node를 실행하려고

node <파일이름>

이라고 터미널 창에 입력하니 아래와 같은 오류가 발생.

node:events:368
      throw er; // Unhandled 'error' event
      ^

Error: listen EADDRINUSE: address already in use :::3000
    at Server.setupListenHandle [as _listen2] (node:net:1319:16)
    at listenInCluster (node:net:1367:12)
    at Server.listen (node:net:1454:7)
    at Object.<anonymous> (/Users/dy/Downloads/node.js-mysql-1/main.js:151:5)
    at Module._compile (node:internal/modules/cjs/loader:1101:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:79:12)
    at node:internal/main/run_main_module:17:47
Emitted 'error' event on Server instance at:
    at emitErrorNT (node:net:1346:8)
    at processTicksAndRejections (node:internal/process/task_queues:83:21) {
  code: 'EADDRINUSE',
  errno: -48,
  syscall: 'listen',
  address: '::',
  port: 3000
}

2. 원인 파악

오류의 내용은 node 가 이미 3000번 포트를 이용해 실행중 이라는 뜻이다.
하지만 분명히 ctrl + c를 해서 중단시켰는데..?

오류를 복붙해서 계속 구글링을 해봤다.
아래는 내가 해봤지만 안 된 목록이다.(글을 보는 분들은 아래 목록 중 하나가 되실 수도 있으니 한 번 해보세요)

  1. 터미널 껐다 켜보기
    제일 간단하고 쉽게 오류 해결 안됨.
  2. visual studio 껐다 켜보기
    마찬가지로 해결 안됨.
  3. 프로세스의 pid를 알아내서 kill하기
  • 우분투, 윈도우 pid 값 알아내는 명령어
$ ps -ef | grep app.js
// ubuntu    7755<pid >  7025  0 08:10 pts/0    00:00:00 node app.js
$ kill -9 7755 <pid >
  • 리눅스, mac 사용자 pid 값 알아내는 명령어
$ sudo lsof -i 3000:
//위 명령어를 치면 > 어쩌구 pid 값 어쩌구~~가 나온다.
$ sudo kill -9 <pid >

3. 문제 해결

원인: 백그라운드에서 3000번 포트를 이용해 계속 돌아가고 있던 pm2

아예 노트북을 재부팅하니 그제서야 node 가 실행되길래 백그라운드에서 뭔가 계속 실행되고 있나 하는 합리적 의심이 들었다.

그렇다. ctrl + c로 종료시켰다고 생각한 pm2가 잘 돌아가고 있던 것이었다. 노드를 위해서 pm2를 설치하고 실행시켰으나 그게 오류의 원인이 될 줄이야..
pm2 종료하는 법을 구글링 했고

pm2 kill

을 입력하면 pm2가 진짜 종료된다.
아래 터미널 사진을 첨부한다.

그럼 왜 pm2가 종료되지 않고 계속 실행되고 있던걸까?
이번기회에 pm2에 대해 정리를 해보자! (역시 에러는 선물이라니까..?)

4. pm2

PM2 홈페이지에서 정의한 PM2

PM2 is a daemon process manager that will help you manage and keep your application online. Getting started with PM2 is straightforward, it is offered as a simple and intuitive CLI, installable via NPM.

PM2는 Node.js 어플리케이션을 쉽게 관리할 수 있게 해주는 Process Manager이다. Node.js 어플리케이션을 cluster mode 로 실행시킨다거나, 메모리가 넘친다거나, 오류로 인해 프로세스가 종료되는 등의 상황에 직면했을 때 각각의 상황을 사용자가 모두 신경 써서 처리해줄 수도 있지만, 너무 복잡하고 신경 써야 할 일들이 많아진다.

PM2를 이용하면 간단한 설정만으로도 이러한 처리를 손쉽게 해결할 수 있다.

데몬이라는 이름은 보이지 않는 곳에서 분자들을 골라주는 일을 하는 도깨비, 유령에서 영감을 얻었다고 합니다.
집에서 TV와 같은 제품은 껐다 켰다 할 수 있지만, 냉장고(데몬) 같은 경우는 항상 작동중이어야 하지 않는가.
따라서Disk And Execution MONitor 로 뜻을 맞춰 말하기도 한다고 한다.
다시 말해, linux에서 daemon이란 서비스의 요청에 응답하기 위해 오랫동안 실행중인 백그라운드 프로세스. 이름이 'd'로 끝나는 프로세스들이 대표적이다. ex) udisksd, gvfsd, systemd, logind, cron



참고문헌

pm2 설명이 자세한 블로그(https://armadillo-dev.github.io/javascript/nodejs/node-js-pm2/)
직접 실습 해보며 daemon 이해(https://velog.io/@jewon119/01.%EB%A6%AC%EB%88%85%EC%8A%A4-%EA%B8%B0%EC%B4%88-%ED%95%AD%EC%83%81-%EC%8B%A4%ED%96%89daemon)
daemon 설명
(https://velog.io/@zoo81001/Linux-Daemon)

profile
모든 건 zero 부터, 차근차근 헛둘헛둘

0개의 댓글