programing

노드 / Express: EADDRINUSE, 주소가 이미 사용 중 - 서버 종료

batch 2023. 5. 21. 17:43
반응형

노드 / Express: EADDRINUSE, 주소가 이미 사용 중 - 서버 종료

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

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

제 코드에는 실제 핸들러가 있지만, 그것이 기본 아이디어입니다.내가 계속해서 받는 문제는

EADDRINUSE, Address already in use

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

저는 제가 해야 할 일은 서버나 연결을 종료하는 것이라고 확신합니다.는 봤다습니전에 해 보았습니다.server.close()process.on('exit', ...);불운하게도

어떤 되고 있는지 입니다.port 3000

sudo lsof -i :3000

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

kill -9 <PID>

<PID>프로세스 ID 또는 프로세스 ID 목록, 이전 명령 출력을 기준으로 합니다.

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

ps aux | grep node

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

그러면:

kill -9 PID

킬에서 -9를 실행하면 SIGKILL이 전송됩니다(SIGTERM 대신).SIGTERM은 가끔 노드에서 무시당하기도 합니다.

win8을 실행하는 노트북에서 이것을 쳤습니다.이것은 효과가 있었습니다.

cmd.exe를 '관리자'로 실행합니다.

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

process.on('exit', ..)프로세스가 충돌하거나 중단된 경우 호출되지 않습니다.되며, 이는 호출다루종이후만에니됩료된프가이트벤다호▁it니출▁and▁loop 때문입니다.server.close() 이벤트 루프를 종료합니다(현재 실행 중인 스택을 여기저기서 기다려야 함). 종료 이벤트 내부에 넣는 것은 말이 안 됩니다...

에는 충시돌, 할것것을 수행합니다.process.on('uncaughtException', ..)그리고 죽이면 죽입니다.process.on('SIGTERM', ..)

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

아래 명령을 사용하여 포트 3000에서 실행 중인 프로세스의 PID를 확인합니다.

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

macOS Monterey(12.0)의 경우:

Apple은 MacOS Monterey에서 AirPlay에 몇 가지 변경 사항을 도입했습니다.이제 5000 및 7000 포트를 사용합니다.프로젝트에서 이러한 포트를 사용하는 경우 이 기능을 사용하지 않도록 설정해야 합니다.

시스템 기본 설정 > 공유 > Untick AirPlay 수신기


macOS Ventura(13.0) 이상 사용자의 경우:

System Settings > General > AirPlay Receiver 비활성화

해결책을 요, 해 보세요. 권한을 주세요. 사용해 보십시오. 사용 권한을 부여합니다.sudo

  sudo pkill node

주로 사용합니다.

npx kill-port 3000

아니면 내 맥에.

killall node

내 대답에 @Gerard의 코멘트를 다시 쓰는 것:

ㅠㅠpkill nodejs또는pkill nodeUNIX와 유사한 OS에 있는 경우.

이렇게 하면 포트에서 실행 중인 노드 서버를 실행하는 프로세스가 중지됩니다.나를 위해 일했습니다.

리눅스

려달을 합니다.ps노드 프로세스의 PID를 확인합니다.

그럼, 뛰어요.sudo kill PID

창문들

태스크 목록을 사용하여 실행 중인 프로세스 목록을 표시합니다.

tasklist /O

. (" " " " " " " " " " " (" " " " " " " " " " ( " " " " " " " " " " " " 합니다.tasklist명령):

taskkill /pid PID

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

kill $(lsof -t -i:3000)

창의 경우 작업 관리자를 열고 노드를 찾습니다.exe 프로세스End Task(작업 종료)로 모두 죽입니다.

여기에 이미지 설명 입력

저는 이 오류를 한 번 경험했고 여기서 많은 접근법을 취했습니다.

제 문제는 같은 app.js 스크립트에 두 번의 통화가 있었다는 것입니다.첫 번째 app.listen()이 성공하여 두 번째 app에서 오류가 발생했습니다.

데 이 된 또 는 디깅에도된또는명입니다.sudo fuser -k 3000/tcp시작했을 수 있는 모든 악성 프로세스를 제거할 수 있습니다(예: forever.js와 함께 실행되는 경우 일부 프로세스가 다시 시작될 수 있지만 저에게는 유용했습니다).

Visual Studio Nobs를 위해 나와 같은.

다른 터미널에서 프로세스를 실행하고 있을 수 있습니다!

Visual Studio에서 터미널을 닫은 에는 터미널이 사라집니다.

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

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

그것을 깨닫지 못한 채로 여러 개

cmd별 윈도우즈

> cmd => 1/2. 검색 => write cmd => opennode.js command prompt

여기에 이미지 설명 입력


2/2. Windows 명령 실행: taskkill

하나 이상의 작업 또는 프로세스를 종료합니다.

taskkill /f /im node.exe

/f 종료

/im종료할 프로세스의 이미지 이름을 지정합니다.

node.exe 파일

여기에 이미지 설명 입력

Windows - 작업 관리자별 수동

는 명은다과같다니습으로 이동하는 것과 .Task Manager에서 details를 합니다.node일( 생각에는 정돈된 것 같습니다).

여기에 이미지 설명 입력

그리고.end task

여기에 이미지 설명 입력

비주얼 스튜디오

때때로 터미널/태스크(클라이언트/서버 등)가 둘 이상 있습니다.를 선택하고 옆으로 닫습니다.

여기에 이미지 설명 입력

스레드나 프로세스를 제거해도 실제로 앱이 종료되지 않는 시나리오가 발생할 수 있습니다(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 절 내에서 실행할 명령으로 추가할 수 있습니다.

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

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

설명:


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

모든 OS에 매우 간단하게 적용할 수 있습니다.

npx kill-port 3000

문제가 위에서 언급한 것과 같더라도 예를 들어 노드가 종료할 수 있는 다른 방법을 찾아야 합니다.

process.on('uncaughtException', (err, origin) => {
    console.log(err);
});

// insert other handlers.

먼저 다음을 사용하여 실행 중인 항목을 확인합니다.

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

그러면 Listen EADDRINUSE :::3000 오류 없이 실행할 수 있습니다.

bash$ sudo netstat -ltnp | grep -w ':3000'
 - tcp6    0      0 :::4000      :::*        LISTEN      31157/node      

bash$ kill 31157

PowerShell 사용자:

Taskkill /IM node.exe /F

Windows 사용자를 위한 UI 솔루션:상위 답변은 Mac 또는 Linux 사용자를 위한 명령인 것 같습니다.기억할 명령이 필요 없는 간단한 솔루션을 찾았습니다. 작업 관리자(ctrl+shift+esc)를 엽니다.실행 중인 백그라운드 프로세스를 확인합니다.Node.js를 찾아서 작업을 종료합니다.

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

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

프로세스 탭 ->

node.exe 프로세스를 선택하고 "End Process"를 누릅니다.

혹시 이 라인을 실수로 여러 번 추가했는지 확인합니다.

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

위 코드는 익스프레스용이지만 코드에서 동일한 포트를 두 번 사용하려는 경우에만 확인하십시오.

Windows에서 다음 오류가 발생했습니다.

EADDRINUSE: 주소가 이미 사용 중입니다. :::8081.

다음 단계를 수행했습니다.

  • 관리자로 CMD를 열었습니다.
  • 다음을 실행했습니다.

netstat -ano|findstr "PID:8081" 명령

다음 프로세스를 얻었습니다.

여기에 이미지 설명 입력

다음을 통해 죽였습니다.

태스크킬 /pid 43144 /f

여기에 이미지 설명 입력

MAC에서 다음과 같은 작업을 수행할 수 있습니다.

raghavkhunger@MacBook-Air ~ % ls of -i tcp:8081 COMMAND PID 사용자 FD TYPE DEVICE SIZE/OFF NODE NAME 노드 23722 사용자 이름 24u IPv60xed16d7ccfd3470t0 TCP *:sunproxyadmin(LISTEN)

username@MacBook-Air ~ % kill - 9 23722

사용자: 열기: 사task manager그리고.end task그자리의 nodejs.exe파일, 잘 작동합니다.

양식에 있는 모든 답변을 고려하여, 한 가지 요점을 추가하고 싶습니다.

Ctrl + Z를 사용하여 노드 앱을 오류로 종료할 때 다음 번에 열려고 할 때 동일한 오류 EADDRINUSE가 발생합니다.

Ctrl + C를 사용하여 노드 앱을 종료하면 다음 번에 열었을 때 문제 없이 종료되었습니다.

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

netstat을 사용하여 사용 중인 포트가 있는 모든 노드 프로세스를 가져온 다음 PID로 원하는 유일한 노드 프로세스를 종료합니다.

netstat -lntp | grep node

모든 노드 프로세스를 얻을 수 있습니다.

tcp6  0      0 :::5744    :::*    LISTEN     3864/node

그런 다음 PID(3864)를 받으면 PID로 프로세스를 종료합니다.

  kill -HUP PID 

핫 노드를 사용하여 서버 충돌/런타임 오류를 방지할 수 있습니다.노드 프로그램[소스] / 프로세스[실행 중인 노드 프로그램]에 변경이 있을 때마다 핫 노드가 자동으로 nodejs 응용 프로그램을 재시작합니다.

글로벌 옵션을 사용하여 npm을 사용하여 핫 노드 설치:

npm 설치 - 핫 노드

언급URL : https://stackoverflow.com/questions/4075287/node-express-eaddrinuse-address-already-in-use-kill-server

반응형