“java.net.BindException : 이미 사용중인 주소 : JVM_Bind”오류를 어떻게 해결합니까?


187

이클립스 에서이 오류가 발생했습니다.

run:
     [java] Error creating the server socket.
     [java] Oct 04, 2012 5:31:38 PM cascadas.ace.AceFactory bootstrap
     [java] SEVERE: Failed to create world : java.net.BindException: Address already in use: JVM_Bind
     [java] Java Result: -1
BUILD SUCCESSFUL
Total time: 10 seconds

왜 지금 나타 났는지 잘 모르겠지만 몇 시간 전에 제대로 작동했습니다. 컴퓨터를 다시 시작해야합니까? 그것의 바닥에 어떻게 도착합니까? 조언이나 조언을 부탁드립니다.


1
코드 평가판을 실행할 때 개발 시스템에서이 문제를 자주 보았습니다. 문제를 어떻게 피할 수 있습니까?
것이다

답변:


141

예, 다른 프로세스가 동일한 포트에 바인딩되어 있습니다.

JVM_BIND 오류가 발생할 때마다 Windows Sysinternals의 TCPView (Windows 만 해당) 가 가장 좋아하는 앱입니다. 어떤 프로세스가 어떤 포트에서 수신 대기 중인지를 보여줍니다. 또한 프로세스를 종료하거나 방해가되는 연결을 닫을 수있는 편리한 컨텍스트 메뉴를 제공합니다.


빠른 해결 방법 : 서버보기 열기> 서버 두 번 클릭> 사용 된 포트 번호 변경 (예 : Tomcat admin, HTTP / 1.1 및 AJP / 1.3)
Adrien Be

2
@novice_developer netstat는 당신이 찾고있는 명령이며, -a 및 -p 옵션을 사용 man netstat하면 나머지는 모두 친구입니다 :)
Monica with sox

1
위의 프로세스가 작동하지 않으면 PC를 한 번 다시 시작하면 작동한다고 생각합니다. 내 경우에는 작동하기 시작했습니다.
Kumar

195

프로세스가 실행중인 포트를 알고 있으면 다음을 입력하십시오 lsof -i:<port>..

예를 들어, lsof -i:8080포트 8080에서 실행중인 프로세스 (pid)를 나열합니다.

그런 다음 프로세스를 종료하십시오. kill <pid>


4
네, 리눅스입니다. 그런 다음 Windows에서 동등한 것을 시도하십시오. 아마 이것이 도움이 될 수 있습니다 : stackoverflow.com/questions/15708/lsof-equivalent-for-windows
Diego Pino

1
그래서 Raspbian을 사용하고 있는데 bash : lsof : command not found입니다. 어떤 제안?
Mona Jalal

1
@MonaJalal hmmm 확실하지 않지만 어쩌면 시도해보십시오sudo apt-get install lsof
Coffee

@DiegoPino 나는 java.net.BindException: Address already in use (Bind failed) 내가 사용 lsof -i:8080하고있어 같은 오류에 직면 하고 tcp6 0 0 :::8080 :::* LISTEN 106872/java있습니다. 어떻게해야합니까? 자바 죽여?
Avijit Barua

@AvijitBarua이 포트에 바인드 된 Java 프로그램의 프로세스 ID (pid)는 106872입니다. 실행하는 모든 Java 프로그램은 자체적으로 프로그램 java (컴파일 된 코드를 실행하는 Java 가상 머신)로 표시됩니다. 그렇습니다.이 자바 프로그램이 중요한 (시스템) 도구가 아니라 자신의 프로그램이라면이 자바 프로그램을 종료하거나 죽일 수 있습니다. 과 같은 작업 관리자를 살펴보십시오 htop. 어쩌면 종료해서는 안되는 유효한 프로그램에서 사용하는 포트에 바인딩하려고 시도 할 수 있습니다.
xuiqzy

113

창에서

netstat -ano

모든 프로토콜, 포트 및 프로세스 수신을 나열합니다. 사용하다

taskkill -pid "proces to kill" /f

포트를 수신하는 프로세스를 종료합니다. 예 :

 taskkill -pid 431 /f

10
netstat -ano | "포트 번호"를 찾으십시오. 특정 포트에 대해서는 Windows에서 이것을 사용하십시오.
BlondCode

나에게 (Windows 10 사용) find작동하지 않았지만 작동했습니다 findstr. 오 탐지를 피하기 위해 콜론을 추가하는 것도 도움이됩니다 (예 :) netstat -ano | findstr :8080. 이 작업을 수행 한 후 PID가 1234를 반환했다고 가정 해 봅시다.이 프로세스의 이름을 찾으려면 tasklist /fi "pid eq 1234"."을 통해이 작업을 수행 할 수 있습니다 .
Steve Chambers

34

Mac에서 :

프로세스 종료 터미널 :kill <pid>

pid 찾기 : 터미널 :lsof -i:<port>

Diego Pino의 답변에서


11
kill <pid>는 Mac에서 작동하지 않았습니다. kill -9 <PID> 나와 함께 작동
Samy Omar

33

Ubuntu / Unix 에서는 아래 설명 된대로이 문제를 2 단계로 해결할 수 있습니다.

  1. 유형 netstat -plten |grep java

    이것은 다음과 유사한 출력을 제공합니다.

    tcp   0   0 0.0.0.0:8080   0.0.0.0:*  LISTEN   1001  76084  9488/java       

    다음 8080은 Java 프로세스가 청취중인 포트 번호 9488이며 프로세스 ID (pid)입니다.

  2. 점유 된 포트를 해제하려면 kill명령을 사용하여이 프로세스를 종료해야합니다 .

    kill -9 9488

    9488이전의 프로세스 ID입니다. 우리가 사용 -9하는 프로세스를 강제로 중지.

이제 포트가 사용 가능해야하며 서버를 다시 시작할 수 있습니다.


Digital Ocean에서 CentOs 서버를 구성하고 있습니다. 이 프로세스를 종료하면 어떻게 서버를 다시 실행할 수 있습니까?
Avijit Barua

자신의 프로그램으로 -9를 사용하고 거기에서 잃을 데이터가없는 경우에만 사용하십시오. -15는 프로세스를 부정하게 종료시킵니다. -15는 프로그램이 스스로 종료하도록 지시합니다.
xuiqzy

27

(Windows 만 해당)

프로세스를 종료하려면 먼저 프로세스 ID (pid)를 찾아야합니다.

명령을 실행하여 :

netstat -ano | findstr :yourPortNumber

아래 그림과 같이

프로세스 ID (PID)를 얻습니다. 이제 동일한 프로세스를 종료하려면 다음 명령을 실행하십시오.

taskkill /pid yourid /f

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


7

동일한 포트에서 다른 프로세스가 실행 중입니다.

작업 관리자에서 실행되는 java.exe 서비스 중 하나를 강제 종료 할 수 있습니다. 아무것도 작동하지 않으면 컴퓨터를 다시 시작해도 문제가 해결됩니다. 이전 테스트에서 소켓을 종료하지 않은 것처럼 보입니다. 도움이 되었기를 바랍니다.


6

가장 간단한 답변을 찾고있는 사람들을 위해 (우리가 일반적으로 놓친 것이므로) 실행중인 프로젝트를 중지하고 다시 시작하십시오. 우리가하는 대부분의 시간은 이전에 실행 한 프로젝트를 중지하는 것을 잊고 프로젝트를 다시 실행할 때 그러한 문제를 보여줍니다.

또한 사진을 더 선명하게하기 위해 첨부하고 있습니다 ( 'Spring tool suite'를 사용합니다). 따라서 동일한 프로젝트를 다시 시작하려면 맨 오른쪽에있는 버튼을 클릭하거나 프로젝트를 중지하려면 오른쪽에서 두 번째 버튼을 클릭 한 다음 맨 왼쪽에있는 버튼을 클릭하여 실행하십시오 당신의 프로젝트. 이것이 이것이 새로운 프로그래머 중 일부의 문제를 해결하기를 바랍니다. :)

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


4

Windows CMD 행에서 다음 명령을 입력하여 바인드 포트에서 연결을 보유하는 프로세스 ID를 찾으십시오.

C :> netstat -a -o

-a 모든 연결 표시

-o 프로세스 식별자 표시

그런 다음 프로세스 를 종료 하십시오.


2

예, 다른 프로세스가 같은 포트를 수신하기 때문에 Guido Simone이 말한 것처럼 우분투에 있다면 명령을 내리는 프로세스를 간단히 종료 할 수 있습니다 sudo kill $(sudo lsof -t -i:[port number])

전의: sudo kill $(sudo lsof -t -i:8080)

그러나 일단 그것은 나를 위해 작동하지 않았습니다. 나는 명령을 내렸다

$ lsof -i:[port] 

아무것도 보여주지 않습니다.

도커 컨테이너를 명령을 사용하여 확인했지만 살아 docker ps -a있지 않았습니다. 모든 컨테이너가 중지되었습니다 (그러나 몇 분 전에 동일한 포트를 사용했던 컨테이너를 중지했습니다.).도 커가 이유가 아닌지 확인하려면 전체를 중지하십시오 명령을 사용하여 도커 프로세스를 수행 sudo service docker stop하고 다시 시도하십시오. 놀랍게도 이클립스는 그 당시 오류를 보여주지 않았습니다. 그것은 내 프로그램을 완벽하게 실행합니다.

내 경험이 도움이 되길 바랍니다.



1

@ Diego Pino가 유닉스에서 lsof를 사용하여 프로세스를 찾고 해당 프로세스를 종료 할 수 있다고 말했다시피 포트는 이미 다른 프로세스에서 사용되고 있습니다. 모두가 얻는 포트. 원하는 포트를 검색하고 죽입니다.

가능한 경우 컴퓨터를 다시 시작하면됩니다. :)


1

PC를 한 번 다시 시작하면 작동한다고 생각합니다. 내 경우에는 작동하기 시작했습니다. 한 가지 더 할 일은 작업 관리자로 가서 프로세스를 종료하십시오.

참조 용 스크린 샷


의견 / 질문으로 답변하지 마십시오. 이것을 삭제하면 좋습니다.
Clijsters

1

제 경우에는 Tomcat이 백그라운드에서 실행 중이었습니다. Eclipse를 사용하는 동안 외부 서블릿으로 설치했습니다. Intellij의 Spring Boot를 사용하면 자체 서버가 있지만 이미 점유되어 있으면 시작할 수 없습니다.
필자의 경우 Tomcat이 자동으로 시작되어 OS를 켜므로 수동으로 종료해야합니다.

$ sudo service tomcat stop

물론 "tomcat"은 사용중인 바람둥이 버전에 따라 다릅니다.
누군가에게 도움이되기를 바랍니다.


0

서버 프로그램을 먼저 시작한 다음 클라이언트 프로그램을 시작할 때 두 개의 콘솔을 열면 Eclipse에서 비슷한 문제가 발생했습니다. 단일 콘솔에서 서버를 닫았다 고 생각하면서 프로그램을 중지했지만 서버는 아닌 클라이언트 만 닫았습니다. 작업 관리자에서 Java 프로세스 실행을 발견했습니다. 이 문제는 개별 콘솔에서 서버 및 클라이언트 프로그램을 모두 닫아서 해결되었습니다 (Eclipse는 최신 활성 프로그램의 콘솔을 보여줍니다). 따라서 서버 프로그램을 다시 시작하면 포트가 다시 열려 캡처됩니다.


0

다른 프로세스에서 포트가 사용 중이어야합니다. https://technet.microsoft.com/en-us/sysinternals/bb897437에서 TCPView를 다운로드 할 수 있습니다. 하고 사용 된 포트에 대한 프로세스를 종료 .

포트를 모르는 경우 시작하지 않는 서버를 두 번 클릭하고 서버 속성 페이지 열기를 클릭 한 다음 왼쪽 열에서 glassfish를 클릭하십시오. 여기에 포트가 있습니다.


0

(1) 포트가 사용 중인지 확인하고 해당 프로세스를 종료하십시오.

$ lsof -i : [포트]

(2) 또 다른 이유는 포트가 ipv6에 의해 사용되기 때문입니다.

/etc/sysctl.conf 편집

이것을 파일에 추가하십시오

net.ipv6.conf.all.disable_ipv6 = 1

그런 다음 효과를냅니다

$ sudo sysctl -p /etc/sysctl.conf

아니면 그냥 재부팅


0

다른 프로세스가 이미 포트를 사용하고 있음을 의미합니다. 이 포트가 다른 중요한 응용 프로그램에서 사용 중이고 해당 응용 프로그램을 닫고 싶지 않은 경우 더 좋은 방법은 무료로 사용할 수있는 다른 포트를 선택하는 것입니다.

다른 포트를 사용하도록 응용 프로그램을 구성하면 응용 프로그램이 작동하는 것을 볼 수 있습니다.


0

창문 :

  1. 프로세스 ID 찾기

    netstat -nao | "8080"찾기

프로세스 ID를 숫자로 표시합니다.

:

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       18856

여기 18856은 프로세스 ID입니다

  1. 그 과정을 죽여

    taskkill / PID 18856 / F

산출 : 성공 : PID 18856의 프로세스가 종료되었습니다.

여기서 taskkill을 사용하면 프로세스 ID를 죽이고 있습니다 : 18856

리눅스 / 맥 :

sudo kill -9 $(sudo lsof -t -i:8080)

여기 sudo lsof -t -i:8080에 sudo kill 명령으로 프로세스를 사용 하고 죽이는 프로세스가 있습니다.

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