상황
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
}
오류의 내용은 node 가 이미 3000번 포트를 이용해 실행중 이라는 뜻이다.
하지만 분명히 ctrl + c를 해서 중단시켰는데..?
오류를 복붙해서 계속 구글링을 해봤다.
아래는 내가 해봤지만 안 된 목록이다.(글을 보는 분들은 아래 목록 중 하나가 되실 수도 있으니 한 번 해보세요)
$ ps -ef | grep app.js
// ubuntu 7755<pid 값> 7025 0 08:10 pts/0 00:00:00 node app.js
$ kill -9 7755 <pid 값>
$ sudo lsof -i 3000:
//위 명령어를 치면 > 어쩌구 pid 값 어쩌구~~가 나온다.
$ sudo kill -9 <pid 값>
원인: 백그라운드에서 3000번 포트를 이용해 계속 돌아가고 있던 pm2
아예 노트북을 재부팅하니 그제서야 node 가 실행되길래 백그라운드에서 뭔가 계속 실행되고 있나 하는 합리적 의심이 들었다.
그렇다. ctrl + c로 종료시켰다고 생각한 pm2가 잘 돌아가고 있던 것이었다. 노드를 위해서 pm2를 설치하고 실행시켰으나 그게 오류의 원인이 될 줄이야..
pm2 종료하는 법을 구글링 했고
pm2 kill
을 입력하면 pm2가 진짜 종료된다.
아래 터미널 사진을 첨부한다.
그럼 왜 pm2가 종료되지 않고 계속 실행되고 있던걸까?
이번기회에 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를 이용하면 간단한 설정만으로도 이러한 처리를 손쉽게 해결할 수 있다.
데몬이라는 이름은 보이지 않는 곳에서 분자들을 골라주는 일을 하는 도깨비, 유령에서 영감을 얻었다고 합니다.
집에서 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)