노드 / 익스프레스 : EADDRINUSE, 이미 사용중인 주소-서버 종료


442

connect를 사용하여 node.js에서 간단한 서버를 실행하고 있습니다.

var server = require('connect').createServer();
//actions...
server.listen(3000);

내 코드에는 실제 처리기가 있지만 기본 아이디어입니다. 내가 계속 얻는 문제는

EADDRINUSE, Address already in use

이전에 충돌이 발생한 후 응용 프로그램을 다시 실행할 때이 오류가 발생합니다. 터미널의 새 인스턴스를 열지 않기 때문에로 프로세스를 닫습니다 ctr + z.

서버 또는 연결을 닫는 것만으로도 확실합니다. 나는 운없이 전화 server.close()를 시도했다 process.on('exit', ...);.


39
실제로, 대신 SIGQUIT를 전송하여 프로그램을 올바르게 닫는 대신 Ctrl + z사용해야합니다. Ctrl + c:) 자세한 내용은 위키 를 참조 하십시오 :)
nacho4d

1
당신은 SIGINT를 의미합니다. SIGQUIT는`ctrl + \`입니다.
Xedecimal

53
유닉스 계열 OS에서 시도해 pkill nodejs보거나pkill node
Gerard

1
비슷한 문제가 있었고 CTRL + C를 사용할 때 깨끗하게 종료 할 수있는이 패키지를 발견했습니다 : npmjs.com/package/exit-hook
Jazzy

1
1. 포트에 매달려 있거나 사용 불능 프로세스 ID가있는 것처럼 보이므로 노드 기반 서비스가 시작되지 않고 오류가 발생했습니다. PORT IN USE (사용 중 오류 주소) 2. 우리는 서버를 재부팅하지 않고 포트 10000.
abksharma

답변:


147

process.on('exit', ..)프로세스가 충돌하거나 종료되면 호출되지 않습니다. 이벤트 루프가 끝날 때만 호출되며, server.close() 일종의 이벤트 루프 종료되므로 (현재 실행중인 스택을 기다려야 함) exit 이벤트 안에 넣는 것은 의미가 없습니다 ...

충돌시, 수행 process.on('uncaughtException', ..)및 종료process.on('SIGTERM', ..)

즉, SIGTERM (기본 종료 신호)은 앱을 정리하는 반면 SIGKILL (즉시 종료)은 앱이 아무것도하지 못하게합니다.


3
또한 process.on ( 'SIGINT', ...)에 유용합니다
farincz

487

명령 행 경로로 이동할 수도 있습니다.

ps aux | grep node

프로세스 ID를 가져옵니다.

그때:

kill -9 PID

강제 종료시 -9를 수행하면 SIGKILL (SIGTERM 대신)이 전송됩니다. 때때로 SIGTERM이 노드에 의해 무시되었습니다.


1
ps aux | grep node아무것도 보여주지 않는다. 여전히 textareaserver --editor-cmd='gvim -f'실패 : 3 월 14 일 21:19:30-socket.io 준비-연결 허용 이제 서버를 시작할 수 있습니다 : EADDRINUSE, 이미 사용중인 주소
Jean Jordaan

75
왜 이것이 killall -9 node
아닌가

1
pidof편리합니다
JVE999

25
나는, 어느 날은 편의를 위해 하나의 라이너로를 구성 ..이 명령은 (이 예에서는 8000) 지정된 포트에서 실행중인 모든 프로세스를 종료합니다 오랫동안이 답변을 사용 : lsof -n -i4TCP:8000 | grep LISTEN | tr -s ' ' | cut -f 2 -d ' ' | xargs kill -9
lukejacksonn

1
한 번에 여러 노드 서버를 실행했으며 일부는 Electron 앱입니다. kill대신 특정 프로세스 ID와 함께 사용해야했습니다 killall.
tuliomir

227

먼저, 어떤 프로세스가 사용 중인지 알고 싶을 것입니다 port 3000

sudo lsof -i :3000

여기 에는이 포트에서 수신되는 모든 PID 가 나열됩니다 . PID가 있으면 다음을 사용하여 종료 할 수 있습니다.

kill -9 {PID}

17
이 명령 ps aux | grep node은 저의 출력과 달리 PID를 명확하게 식별합니다 . 나도 필요하지 않았다sudo
Phil Gibbins

이것이 가장 좋은 대답입니다. 원사와 함께 React Native를 사용하여 포트 8081에서 잘 작동했습니다.
페르난도 Barbosa

이것은 나를 위해 잘 작동했습니다. 포트 3000이 사용 된 위치를 식별하여 닫을 수 있습니다. 나는 또한 필요하지 않았다 sudo.
Campalo

아주 잘. 나는 또한 명령을받은 후 시도했습니다killall -9 {COMMAND}killall -9 node

그것은 나를 위해 일했다
Anoop PS

162

win8을 실행하는 랩톱 에서이 문제를 해결했습니다. 이것은 효과가 있었다.

cmd.exe를 '관리자'로 실행하십시오.

C:\Windows\System32>taskkill /F /IM node.exe
SUCCESS: The process "node.exe" with PID 11008 has been terminated.

명령 창에서 실행하고 실수로 닫았습니다. 노드는 백그라운드에서 계속 실행 중입니다 (세션이 종료 된 후에도). 필자의 경우 웹 소켓을 통해 연결된 브라우저 탭을 닫으면 마침내 종료되었습니다.
Bertus Kruger

6
taskkill /F /IM node.exe모든 디렉토리에서 Windows의 매력처럼 작동합니다 :-) 공유 주셔서 감사합니다!
Marty McGee

2
이것이 윈도우 용으로 확인할 수있는 유일한 단일 작업 솔루션입니다
Code Whisperer

4
Windows 10에서 작동합니다. cmd.exe를 관리자 btw로 실행할 필요가 없었습니다.
Glenn Werner

74

아래 명령으로 포트 3000에서 실행중인 프로세스의 PID 즉 ID를 확인하십시오.

lsof -i tcp:3000

다음과 같이 출력됩니다.

COMMAND  PID   USER   FD   TYPE  DEVICE  SIZE/OFF NODE NAME
node     5805  xyz    12u  IPv6  63135    0t0     TCP  *:3000 (LISTEN)

이제 다음을 사용하여 프로세스를 종료하십시오.

kill -9 5805

이것은 sls 오프라인 플러그인을 사용할 때 나를 위해 일했습니다.
Junaid Atique

감사합니다! 방금 몇 시간 전에 반응을 배우기 시작했습니다. :) 서버를 중지 한 후 서버를 다시 실행하면 이러한 오류가 발생합니다.
Glenn

lost를 사용하면 출력이 없습니다. 이것은 해당 부분에 프로세스가 없음을 의미합니까?
x89

42

이 솔루션을 찾았습니다. 사용 권한을 부여하십시오. sudo

  sudo pkill node

여전히이 명령으로 노드 프로세스를 볼 수 있습니다.ps aux | grep node
IgorGanapolsky

29

리눅스

ps노드 프로세스의 PID를 실행 하고 결정하십시오.

그런 다음 실행 sudo kill PID

윈도우

tasklist를 사용하여 실행중인 프로세스 목록을 표시하십시오.

tasklist /O

그런 다음 tasklist명령 에서 얻은 PID를 사용하여 노드 프로세스를 종료하십시오 .

taskkill /pid PID

1
그리고 Windows라면?
Trevor

1
참고로 ... 어떤 이유로 git-bash의 taskkill 명령에 내 플래그에 이중 슬래시를 사용해야했습니다. taskkill //IM node.exe 그리고 노드를 죽였습니다. 일했다.
nawlbergs

23

다음은 하나의 라이너입니다 (3000을 포트 또는 구성 변수로 대체).

kill $(lsof -t -i:3000)

20

나는이 오류가 한 번 발생했고 여기에서 많은 접근법을 취했습니다.

내 문제는 app.listen(3000);동일한 app.js 스크립트에서 두 번의 호출 이 있다는 것 입니다. 첫 번째 app.listen ()은 두 번째 오류가 발생한 곳에서 성공했습니다.

내가 디버깅에 도움이 된 또 다른 유용한 명령 sudo fuser -k 3000/tcp은 시작했을 수있는 모든 불량 프로세스를 종료하는 것입니다 (일부 프로세스는 다시 시작될 수 있습니다 (예 : forever.js로 실행되는 경우 유용하지만 나에게 유용함)).


같은 문제가 여기에 ... 실행에 대한이 오류를 얻는 동안 디버깅에서 제대로 작동했다는 이상한npm start
Asqan

16

Windows의 경우 작업 관리자를 열고 node.exe 프로세스를 찾으십시오. End Task로 모든 것을 죽입니다.

여기에 이미지 설명을 입력하십시오


1
Windows 사용자에게는 매우 쉽고 복잡하지 않음
momal

효과가있다. 감사합니다
Najathi

14
ps aux | grep node
kill -9 [PID] (provided by above command)

기술:


  1. ps는 프로세스 상태를 제공하고, aux는 모든 사용자 프로세스, u : 사용자 자신의 프로세스, x : 터미널에 연결되지 않은 다른 모든 프로세스의 목록을 제공합니다.
  2. 파이프 기호 : | ps aux의 결과를 전달하여 추가로 조작합니다.
  3. grep은 ps aux가 제공 한 목록에서 제공된 문자열 (이 경우 노드)을 검색합니다.

12

참고로, 하나의 명령으로 프로세스를 종료 할 수 있습니다 sudo fuser -k 3000/tcp. 이는 개발에 일반적으로 사용되는 8000, 8080 또는 9000과 같은 다른 모든 포트에서 수행 할 수 있습니다.



11

먼저 다음을 사용하여 실행중인 것을 찾으십시오.

sudo lsof -nP -i4TCP:3000 | grep LISTEN

당신은 다음과 같은 것을 얻을 것입니다 :

php-fpm 110 root    6u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
php-fpm 274 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
php-fpm 275 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)

그런 다음 다음과 같이 프로세스를 종료 할 수 있습니다.

sudo kill 110

그런 다음 EADDRINUSE ::: 3000 오류를 수신하지 않고 실행할 수 있습니다.


nodemon을 사용하고 있으며 서비스를 다시 시작합니다. 노드 몬을 죽일 방법이 있습니까?
Patel Smit

10

나와 같은 Visual Studio Noobs

다른 터미널에서 프로세스를 실행 중일 수 있습니다!

폐쇄 에 터미널을 비주얼 스튜디오 , 터미널은 사라집니다 .

나는 이전의 것이 파괴되었다고 생각하는 새로운 것을 수동으로 만들었습니다. 실제로 새 터미널 을 클릭 할 때마다 실제로 이전 터미널 위에 새 터미널을 만들었 습니다 .

그래서 첫 번째 터미널을 찾았습니다. Voila, 거기서 서버를 운영하고있었습니다.

그것을 깨닫지 못한 여러 터미널


1
그래 내 동생
Jaydeep Shil

8

작업 관리자 (ctrl + alt + del)->

프로세스 탭->

"node.exe"프로세스를 선택하고 "프로세스 종료"를 누르십시오


찾고있는 노드 노드 프로세스를 종료하는 경우 전체 노드 프로세스를 종료해야합니다.
Jimmy Obonyo Abor

8

스레드 또는 프로세스를 종료해도 실제로 앱이 종료되지 않는 시나리오가 발생할 수 있습니다 (이것은 Linux 및 Windows에서 가끔씩 발생합니다). 때로는 닫지 않은 인스턴스가 이미 실행 중일 수 있습니다.

이러한 상황의 결과로, 나는 다음에 추가하는 것을 선호합니다 package.json.

"scripts": {
    "stop-win": "Taskkill /IM node.exe /F",
    "stop-linux": "killall node"
},

그런 다음 다음을 사용하여 전화를 걸 수 있습니다.

npm run stop-win
npm run stop-Linux

원하는 경우 인수 플래그를 사용하여 더 좋아지고 BIN 명령을 만들 수 있습니다. try-catch 절 내에서 실행할 명령으로 해당 명령을 추가 할 수도 있습니다.


5

윈도우 사용자에서 : 개방 task manager과 파일, 그것은 잘 작동합니다.end tasknodejs.exe


4

핫 노드를 사용하여 서버 충돌 / 런타임 오류를 방지 할 수 있습니다. 노드 프로그램 [source] / process [running node program]에 변경이있을 때마다 핫 노드가 자동으로 nodejs 애플리케이션을 다시 시작합니다.

전역 옵션을 사용하여 npm을 사용하여 핫 노드를 설치하십시오.

npm install -g 핫 노드


pm2가 더 나은 선택입니다. 더 강력하고 더 많은 옵션. 영원히 가지고있는 루트로 실행할 때 문제가 없습니다.
Lucas

@Lucas 당신이 말하는 근본적인 문제는 무엇입니까? 불행히도 (일부 라이센스 문제로 인해) 직장에서 제품에 pm2 대신 영원히 사용하도록 강요되어 많은 걱정이되었습니다!
GPX

4

양식의 모든 답변과 관련하여 포인트를 추가하고 싶습니다.

Ctrl + Z를 사용하여 오류가 발생했을 때 노드 응용 프로그램을 종료하면 다음에 열 때 바로 동일한 오류 EADDRINUSE가 발생한다는 것을 알았습니다.

Ctrl + C를 사용하여 노드 앱을 종료하면 다음에 열 때 장애가 발생하지 않았습니다.

포트 번호를 오류가 아닌 다른 포트 번호로 변경하면 문제가 해결되었습니다.


1
Ctrl + C가 맞습니다. 이전과 동일한 포트 번호를 사용했으며 이전과 동일하게 작동했습니다.
vipulnj 2016 년

2
<key> Ctrl-Z </ key>는 프로세스를 중지하지 않습니다. 다른 명령을 실행할 수 있도록 백그라운드에 배치합니다. 이것은 유닉스 쉘입니다. 프로세스를 계속하려면 fg동일한 콘솔에서 사용하십시오 . 그런 다음 명령 행에 다양한 명령을 입력 한 후 해당 서버에서 발생하는 상황을 볼 수 있습니다.
Alexis Wilke

4

Linux에서.

에 기능 추가 ~/.bashrc:

function killTcpListen () {
  kill -9 $(lsof -sTCP:LISTEN -i:$1 -t)
}

변경 사항 풀 : source ~/.bashrc

그리고 그것을 사용하십시오 : killTcpListen 3000


3

실수 로이 줄을 여러 번 추가했는지 확인하십시오.

app.listen(3000, function() {
  console.log('listening on 3000')
});

위 코드는 명시 적이지만 코드에서 동일한 포트를 두 번 사용하려고하는지 확인하십시오.


3

Win10, git bash v2.15, 노드 v8.9.1, npm v5.5.1

노드를 시작하는 package.json 스크립트가 있습니다. "start": "node index.js"

ctrl + c로 죽였는 지 여부에 관계없이 이것을 사용할 때 마다이 문제가 발생했습니다.

방금 node index.jsgit bash에서 실행 npm run start하여 ctrl + c로 죽이면이 오류가 발생하지 않습니다.

왜 그런지 잘 모르겠지만 이것이 누군가에게 도움이 될 것이라고 생각했습니다.


1
본질적으로 동일한 설정으로 동일한 문제가 발생합니다. 필자의 경우 npm을 통해 Express 앱을 실행하면 두 개의 프로세스가 생성되지만 ctrl + c를 사용할 때 하나만 닫힙니다. 노드만으로 앱을 시작할 때 하나의 프로세스 만 열려 있고 올바르게 닫힙니다.
worc

1
git for windows 문제 는 모든 것에 빛을 비추는 것입니다. 박하와 cygwin 의존성 사이에 버그가있는 것 같습니다.
worc

3

UI 솔루션 Windows 사용자 : 최고의 답변이 저에게 효과적이지 않다는 것을 알게되었습니다. Mac 또는 Linux 사용자를위한 명령 인 것 같습니다. 기억해야 할 명령이 필요없는 간단한 해결책을 찾았습니다 : 작업 관리자 열기 (ctrl + shift + esc). 실행중인 백그라운드 프로세스를보십시오. Node.js를 찾아서 작업을 종료하십시오.

이 작업을 수행 한 후 문제가 해결되었습니다. 다른 답변에서 언급했듯이 이전에 오류가 발생하여 정기적 인 종료 / 정리 기능이 호출되지 않았기 때문에 여전히 실행중인 백그라운드 프로세스이므로 작업 관리자에서 프로세스를 찾아서 종료하는 것이 한 가지 방법입니다 . 터미널 / powerShell에서 프로세스를 실행 한 경우 일반적으로 ctrl + c를 사용하여 프로세스를 종료 할 수 있습니다.


예, 정답 감사합니다
DINA TAKLIT

3

내 대답에 @ Gerard의 의견을 다시 작성하십시오.

시도 pkill nodejspkill node에 경우 유닉스 계열 OS.

포트에서 실행되는 노드 서버를 실행하는 프로세스가 종료됩니다. 나를 위해 일했다.

나마스테


2

노드가 메모리 어딘가에서 실행 중이며 해당 포트가 잠겨 있습니다. Windows에서이 문제는 대부분의 Windows 문제와 마찬가지로 CTRL+ ALT+를 DEL누르고 재부팅 하면 해결됩니다 .


이 질문은 다른 많은 질문에 대한 답변입니다. 전원을 껐다가 다시 켜십시오. 천재.
datUser

1

이 문제의 이유는 다음과 같습니다.

  1. Skype와 같은 하나의 응용 프로그램이이 포트에서 실행될 수 있습니다.
  2. 노드가 충돌하여 포트가 해제되지 않았을 수 있습니다.
  3. 서버를 두 개 이상 시작하려고 시도했을 수 있습니다. 이 문제를 해결하기 위해 서버가 시작되었는지 여부를 확인하기 위해 부울을 유지할 수 있습니다. 부울 리턴이 false이거나 정의되지 않은 경우에만 시작해야합니다.

1

server.close ()는 연결을 닫는 데 시간이 걸리므로이를 비동기 호출로 만들어야합니다.

await server.close();

중요 : await 를 사용할 때는 다음 과 같이 캡슐화 함수에서 async 키워드를 사용해야합니다 .

async () => {
  await server.close();
}

1

터미널 / cmd에서 아래 명령을 사용하여 포트를 변경하십시오 (npm run dev is for node.js) 응용 프로그램을 실행하는 다른 명령이 포트를 변경하는 동안 더 쉽고 빠릅니다. 또한 3002 대신 시스템에서 사용 가능한 모든 포트 번호를 사용할 수 있습니다

PORT=3002 npm run dev

갑자기 종료하거나 무의식적으로 프로젝트를 종료하는 동안 프로젝트를 실행하는 대부분의 경우 제어 + z를 누르면 포트에서 빠져 나옵니다. 항상 포트에서 빠져 나오지 않는 제어 + c가 서버 또는 프로젝트를 실행합니다.

또한 코드에서 포트 번호를 변경하는 시간

server.listen(3002);

0

이것은 동일한 포트에서 두 개의 노드 서버가 실행 중임을 의미합니다. 하나가 포트에서 실행 중이면 다른 포트로 3000을 변경하고 3001이라고 말하면 모든 것이 잘 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.