티스토리 뷰

반응형

 

Problem

파이썬을 공부하면서 Flask라는 프레임워크를 설치하고 5000 포트에 연결하는데, 이미 연결되어 연결이 되지 않는다는 오류가 나왔다. 

 

if __name__ == '__main__':
    app.run('0.0.0.0', port=5000, debug=True)

 

OSError: [Errno 48] Address already in use

 

error 문구 그대로 이미 5000port를 사용하고 있다는 뜻이다. 

가장 간단한 방법으로는 터미널에서 해당포트와 연결되어 있는 프로세스를 끊어주는 것이다. 

 

이는 터미널에서 'kill'이라는 명령어를 사용해 쓸 수 있다. 

혹시 이 방법도 시도를 안해봤다면 자세한 방법은 아래에 적어놓을 테니 먼저 시도해보시길..

 

하지만 나의 경우 이 방법으로 끊어도 다시 자동으로 새롭게 연결되어 끊어도 끊어도 결코 끊을 수 없는 상황이 벌어졌다.

무한의 굴레에서 벗어나지못하는 이 상황.. 대체 왜 그런 걸까..

구글링과 커뮤니티를 찾아봤지만 이 당시에는 정확히 어떤 게 문제였는지 잘 몰라서 결국 내가 원하는 해결방법을 찾지 못했다.

 

다만 항상 맥북 display를 아이패드와 공유해서 쓰고 있는데 port를 끊을 때마다  그 연결이 해제되는 것을 보고 

'내가 이걸 연결시켜놔서 mac에서 5000 port를 자동으로 사용해서 쓰고 있는건가?' 라는 생각이 들었고, 

그렇다면 억지로 어떻게 해서 끊더라도 내가 아이패드와 맥북을 연결해서 쓰지는 못하는 상황이 되니 5000port를 선택하는 대신

8000 port로 바꿔서 공부를 했다. 

 

하지만, 공부를 계속 이어 하다가

뭔지 모를 찝찝함.. 궁금함.. 정말 내가 아이패드를 연결해서인가..?라는 생각이 머릿속을 떠나지 못했고, 

결국 시간을 더 투자해 들여다보는 과정을 거쳐 결국 어떤 게 원인이었는지 찾아냈다. 

 

아마 설루션을 보면 매우 황당하고, 오래된 개발자분이 시라면 화가 날지도 모른다..!!!

 


Solutions

 

Method 1_ Mac os 가 사용하고 있는 5000 port 끊기

 

Step 1.

 

특정 포트번호를 사용 중인 PID를 확인한다. 참고로 PID는 process_id 의 축약어이다.

lsof -n -i TCP:5000

그럼 아래에 사용중인 프로세스와 PID값이 나온다. 

 

COMMAND      PID 
ControlCe   12345

 

 

Step 2

 

. kill -9 pid 값 명령어를 통해 연결 중인 프로세스를 끊어준다. 

 

kill -9 12345

앞서 말한대로 MacOS 맥북 유저인 사람 중

5000 port의 프로세스가 ControlCe으로 나온다면 아무리 kill명령어를 반복하더라도 다시 새롭게 PID가 생기는 경험을 할 것이다. 

 

이는 2021년 6월에 릴리스 된 맥 OS 몬테레이에서 port 5000을 airplay연결 포트로 사용하고 있기 때문이었다. 

찾다 보니 개발 커뮤니티에서도 오래전부터 개발자들이 로컬 개발을 위해 5000 port를 꾸준히 사용하고 있고 로컬서버의 기본 기능이라고 할 수 있는데 대체 왜 5000port를 사용한 건지 모르겠다는 불만이 적지 않다.

https://medium.com/pythonistas/port-5000-already-in-use-macos-monterey-issue-d86b02edd36c

 

5000 port는 개발자들이 주로 사용하기 이전부터 꾸준히 원격 오디오 출력 프로토콜로 사용하고 있었다며 애플을 나름 옹호하는 댓글도 있었다..댓글을 읽는 재미가 있네..

 

아무튼, 그건 그거고 해결을 위해 다음의 간단한 과정을 거치면 5000port는 우리의 것이 된다..!

 

 

 

 

Method 2_ 터미널을 통해 기존에 사용되고 있던 프로세스를 종료

 

Step 1

Mac 좌측 상단 애플 로고 > System Preferences.. 클릭

 

 

 

Step 2

Mac 좌측 상단 애플로고 > System Preferences.. 클릭

 

 

 

Step 3

하단 AirPlay Receiver 체크 해제 

 

 

이렇게 하면 port5000을 사용하고 있던 ControlCe가 해제되고, 처음으로 돌아가 다시 5000 포트를 실행하면 잘 연결되는 것을 

확인할 수 있다. 

 

 

 


 

Q. 만약 AirPlay도 사용하고 싶다면?

그냥 다시 AirPlay Receiver체크 해제했던걸 켜주면 된다. 이미 5000 port를 파이썬과 연결해놓은 상태이기 때문에 AirPlay Receiver(ControlCe)은 새로운 port번호로 잡히게 된다. 

 

현재 연결된 프로세스와 포트 확인 명령 :

 

sudo lsof -PiTCP -sTCP:LISTEN

 

 

아래와 같이 Python 은 5000 port로, ControlCe는 54174를 사용하고 있는 모습을 볼 수 있다.

맥을 재부팅하면 다시 5000으로 돌아가려나..? 그건 다음에 재부팅할 일 있을 때 확인해봐야겠다 : ) 

> 재부팅하면 airplay가 다시 5000 port를 가리키는 걸 확인했다. 이 부분은 자동으로 되지 않는 걸로..

 

 


 

Reference : https://medium.com/pythonistas/port-5000-already-in-use-macos-monterey-issue-d86b02edd36c

반응형