java.net.BindException : Address already in use bind 에러 해결

Address already in use : bind 에러 메시지는 다른 프로세스에서 이미 사용 중인 포트에 네트워크 소켓을 바인딩하려고 할 때 발생합니다. 예를 들어, 8080 포트에 LISTENING 상태인 프로세스가 있는데 다른 프로세스가 8080 포트를 사용하려고 하는 경우입니다.

Address already in use 에러

원인

1. 문제없이 사용하던 프로세스인데 갑자기 해당 오류가 발생하는 경우

의심해 볼 수 있는 건 프로세스가 완전히 종료되지 않은 상태에서 다시 시작한 경우입니다. 서비스를 종료하면 해당 서비스를 사용하고 있던 클라이언트와 연결을 해제하고 소켓을 닫는 과정을 거치는데, 소켓이 제대로 닫히지 않은 상태에서 다시 서비스를 시작하면 Address already in use 에러가 발생할 수 있습니다.

 

2. 서비스를 처음 올리는 시점부터 해당 문제가 발생한 경우

실제로 이미 다른 프로세스가 포트를 할당하고 있기 때문일 겁니다.

 

해결

어느 경우든 근본적인 원인은 같습니다. 사용되고 있는 다른 프로세스를 종료하거나 다른 사용 가능한 포트를 할당해서 사용하면 됩니다.

 

1. 사용 중인 특정 포트를 확인합니다.

#리눅스
lsof -i :<port_number>

또는

netstat -nap | grep <port_number>
#윈도우
netstat -abo | findstr "<port_number>"

 

예시) ssh가 사용하는 22번 포트 조회

#리눅스
[root@localhost ~]# netstat -ntlp | grep 22
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1275/dnsmasq
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1082/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      1082/sshd
#윈도우
C:\Users\name>netstat -abo | findstr "22"
  TCP    0.0.0.0:135            [id]              LISTENING       1228

 

2. 올라와 있는 프로세스가 종료되어도 되는 경우라면 아래의 명령어로 종료시킵니다.

#리눅스
kill -9 <process_id>
#윈도우
taskkill /F /PID <process_id>

 

예시) 

#리눅스
kill -9 1082
#윈도우
taskkill /f /pid 1228

 

3. 만약 종료해서는 안 되는 프로세스면 다른 포트를 사용합니다.

반응형

댓글

Designed by JB FACTORY