노드 / 익스프레스 : 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', ...);
.
process.on('exit', ..)
프로세스가 충돌하거나 종료되면 호출되지 않습니다. 이벤트 루프가 끝날 때만 호출되며, server.close()
일종의 이벤트 루프 가 종료되므로 (현재 실행중인 스택을 기다려야 함) exit 이벤트 안에 넣는 것은 의미가 없습니다 ...
충돌시, 수행 process.on('uncaughtException', ..)
및 종료process.on('SIGTERM', ..)
즉, SIGTERM (기본 종료 신호)은 앱을 정리하는 반면 SIGKILL (즉시 종료)은 앱이 아무것도하지 못하게합니다.
명령 행 경로로 이동할 수도 있습니다.
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.
먼저, 어떤 프로세스가 사용 중인지 알고 싶을 것입니다 port 3000
sudo lsof -i :3000
여기 에는이 포트에서 수신되는 모든 PID 가 나열됩니다 . PID가 있으면 다음을 사용하여 종료 할 수 있습니다.
kill -9 {PID}
아래 명령으로 포트 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
이 솔루션을 찾았습니다. 사용 권한을 부여하십시오. sudo
sudo pkill node
리눅스
ps
노드 프로세스의 PID를 실행 하고 결정하십시오.
그런 다음 실행 sudo kill PID
윈도우
tasklist를 사용하여 실행중인 프로세스 목록을 표시하십시오.
tasklist /O
그런 다음 tasklist
명령 에서 얻은 PID를 사용하여 노드 프로세스를 종료하십시오 .
taskkill /pid PID
나는이 오류가 한 번 발생했고 여기에서 많은 접근법을 취했습니다.
내 문제는 app.listen(3000);
동일한 app.js 스크립트에서 두 번의 호출 이 있다는 것 입니다. 첫 번째 app.listen ()은 두 번째 오류가 발생한 곳에서 성공했습니다.
내가 디버깅에 도움이 된 또 다른 유용한 명령 sudo fuser -k 3000/tcp
은 시작했을 수있는 모든 불량 프로세스를 종료하는 것입니다 (일부 프로세스는 다시 시작할 수 있습니다 (예 : forever.js로 실행되는 경우 유용하지만 나에게 유용)).
다음은 하나의 라이너입니다 (3000을 포트 또는 구성 변수로 대체).
kill $(lsof -t -i:3000)
Windows의 경우 작업 관리자를 열고 node.exe 프로세스를 찾으십시오. End Task로 모든 것을 죽입니다.
참고로, 하나의 명령으로 프로세스를 종료 할 수 있습니다 sudo fuser -k 3000/tcp
. 이는 개발에 일반적으로 사용되는 8000, 8080 또는 9000과 같은 다른 모든 포트에서 수행 할 수 있습니다.
PowerShell 사용자 :
Taskkill / IM node.exe / F
먼저 다음을 사용하여 실행중인 것을 찾으십시오.
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 오류를 수신하지 않고도 실행할 수 있습니다.
ps aux | grep node
kill -9 [PID] (provided by above command)
기술:
- ps는 프로세스 상태를 제공하고, aux는 모든 사용자 프로세스, u : 사용자 자신의 프로세스, x : 터미널에 연결되지 않은 다른 모든 프로세스의 목록을 제공합니다.
- 파이프 기호 : | ps aux의 결과를 전달하여 추가로 조작합니다.
- grep은 ps aux가 제공 한 목록에서 제공된 문자열 (이 경우 노드)을 검색합니다.
작업 관리자 (ctrl + alt + del)->
프로세스 탭->
"node.exe"프로세스를 선택하고 "프로세스 종료"를 누르십시오
나와 같은 Visual Studio Noobs
다른 터미널에서 프로세스를 실행 중일 수 있습니다!
후 폐쇄 에 터미널을 비주얼 스튜디오 , 터미널은 사라집니다 .
나는 이전의 것이 파괴되었다고 생각하는 새로운 것을 수동으로 만들었습니다. 실제로 새 터미널 을 클릭 할 때마다 실제로 이전 터미널 위에 새 터미널을 만들었 습니다 .
그래서 첫 번째 터미널을 찾았고 ... Voila, 거기서 서버를 운영하고있었습니다.
핫 노드를 사용하여 서버 충돌 / 런타임 오류를 방지 할 수 있습니다. 노드 프로그램 [source] / process [running node program]에 변경이있을 때마다 hot-node가 nodejs 응용 프로그램을 자동으로 다시 시작합니다.
전역 옵션을 사용하여 npm을 사용하여 핫 노드를 설치하십시오.
npm install -g 핫 노드
양식의 모든 답변과 관련하여 포인트를 추가하고 싶습니다.
Ctrl + Z를 사용하여 오류가 발생했을 때 노드 응용 프로그램을 종료하면 바로 다음에 열 때 동일한 오류 EADDRINUSE가 발생한다는 것을 알았습니다.
Ctrl + C를 사용하여 노드 앱을 종료하면 다음에 열 때 장애가 발생하지 않았습니다.
포트 번호를 오류가 아닌 다른 포트 번호로 변경하면 문제가 해결되었습니다.
실수 로이 줄을 여러 번 추가했는지 확인하십시오.
app.listen(3000, function() {
console.log('listening on 3000')
});
위 코드는 명시 적이지만 코드에서 동일한 포트를 두 번 사용하려고하는지 확인하십시오.
Linux에서.
에 기능 추가 ~/.bashrc
:
function killTcpListen () {
kill -9 $(lsof -sTCP:LISTEN -i:$1 -t)
}
변경 사항 풀 : source ~/.bashrc
그리고 그것을 사용하십시오 : killTcpListen 3000
Win10, git bash v2.15, 노드 v8.9.1, npm v5.5.1
노드를 시작하는 package.json 스크립트가 있습니다. "start": "node index.js"
이것을 사용할 때마다 ctrl + c로 죽였는 지 여부에 관계 없이이 문제가 발생했습니다.
방금 node index.js
git bash에서 실행 npm run start
하고 ctrl + c로 죽이면이 오류가 발생하지 않습니다.
왜 그런지 잘 모르겠지만 이것이 누군가에게 도움이 될 것이라고 생각했습니다.
노드가 메모리 어딘가에서 실행 중이며 해당 포트가 잠겨 있습니다. Windows에서이 문제는 대부분의 Windows 문제와 마찬가지로 CTRL+ ALT+를 DEL누르고 재부팅 하면 해결됩니다 .
이 문제의 이유는 다음과 같습니다.
- Skype와 같은 하나의 응용 프로그램이이 포트에서 실행될 수 있습니다.
- 노드가 충돌하여 포트가 해제되지 않았을 수 있습니다.
- 서버를 두 개 이상 시작하려고 시도했을 수 있습니다. 이 문제를 해결하기 위해 서버가 시작되었는지 여부를 확인하기 위해 부울을 유지할 수 있습니다. 부울 리턴이 false이거나 정의되지 않은 경우에만 시작해야합니다.
server.close ()는 연결을 닫는 데 시간이 걸리므로이를 비동기 호출로 만들어야합니다.
await server.close();
중요 : await 를 사용할 때는 다음 과 같이 캡슐화 함수에서 async 키워드를 사용해야합니다 .
async () => {
await server.close();
}
스레드 또는 프로세스를 종료해도 실제로 앱이 종료되지 않는 시나리오가 발생할 수 있습니다 (이것은 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 절 내에서 실행할 명령으로 해당 명령을 추가 할 수도 있습니다.
이것은 동일한 포트에서 두 개의 노드 서버가 실행 중임을 의미합니다. 하나가 포트에서 실행 중이면 다른 포트로 3000을 변경하고 3001이라고 말하면 모든 것이 잘 작동합니다.
왜 아무도 아직이 가능성을 언급하지 않았는지 궁금합니다.
::listen(port)
유효한 포트 번호 표현이 아닌 문자열 (의도적이든 아니든) 을 제공하면 내부적으로 포트 번호로 변환 할 수 있습니다.-1
그러면 개미가 엔진을 해당-1
포트 에 연결하려고 시도 하여 동일한EADDRINUSE
오류가 발생합니다. 이는 약간 혼란 스러울 수 있으며 오류 수정 검색 ( hi, me xD ) 에 대해 잘못된 방향으로 전환합니다 .
따라서 코드를 디버그하고 포트를 사용하는 프로세스를 확인하기 전에 함수에 정확히 전달한 내용을 확인하십시오 .
제 경우에는 Eclipse가 열려 있기 때문입니다 ...
주어진 PORT를 사용하는 노드 프로세스 만 종료하십시오. 다른 사람들이 언급했듯이 bash에서 사용할 수 있습니다kill $(lsof -t -i:PORT)
Here is a Windows solution (there's a way!): netstat -bona | findstr ".0:PORT +0.0.0.0:0 +LISTENING" | for /f "tokens=5" %t in ('more') do taskkill /PID:%t /F
. You need an elevated terminal for that (in VSCode you'll need to open itself with elevation, as integrated terminal cannot be elevated).
PS: if findstr
not available, you can simply use find
and replace " +" for spaces (non regex mode)
For all who came to this post and tried all may probably using nodemon or forever to do this. For example if you run PORT=6060 Nodemon
You might get the same error that port 6060 is already in use.
If this is the case just run your project without nodemon if you really need to define port during run. Alternatively you can define port in your file itself if you wanna stick to nodemon.
For me I do this now PORT=6060 node app.js
'development' 카테고리의 다른 글
RGB 색상의 밝기를 결정하는 공식 (0) | 2020.02.28 |
---|---|
데이터 프레임의 열 이름 변경 (0) | 2020.02.28 |
파이썬과 핍, 사용 가능한 패키지의 모든 버전을 나열합니까? (0) | 2020.02.28 |
AngularJS로 Enter 키를 누르면 양식 제출 (0) | 2020.02.28 |
터미널에서 반응 네이티브 앱을 실행하는 중 오류 발생 (iOS) (0) | 2020.02.28 |