특정 포트를 수신 포트로 쓰고 있는 process를 종료하고 싶습니다. linux에서는 lsof라던지 ps 같은 것으로 꽤 편하게 할 수 있었습니다. 윈도우에서는 방법이 없을까요?

 


 먼저, django 서버를 켜 보겠습니다. 이것은 8000번 포트를 씁니다. 우리는 특정 포트를 쓰는 프로세스를 알고 싶은데요. 작업 관리자 창을 열어보겠습니다.

 

 

 성능 탭을 보시면 리소스 모니터 열기가 있습니다. 한 번 열어 보겠습니다.

 

 

 작업 관리자 창보다는 조금 더 상세한 내용을 볼 수 있습니다. 탭을 보니까, 개요, CPU, 메모리, 디스크, 네트워크가 있습니다. 이 중, 네트워크를 클릭해 보겠습니다.

 

 

 보면, 이 탭은 네트워크 활동에 관련된 정보를 보여주는 모양입니다. 이 중, 수신 대기 포트 탭을 눌러주겠습니다. PID와, 포트, 프로토콜이 나옵니다. 포트 오름차순으로 정렬하면 특정 포트를 어떤 프로세스가 수신 포트로 쓰고 있는지를 알 수 있습니다. 8000번 포트를 PID가 21000번인 python.exe가 쓰고 있음을 알 수 있습니다. 이제 PID가 21000인 프로세스를 CPU나 메모리 탭에서 찾은 다음에 종료를 해주면 됩니다만, 저는 power-shell에서 처리하는 것이 조금 더 편합니다.

 

 

 powershell에서 Get-Process는 프로세스의 정보를 얻어옵니다. 그리고, Stop-Process는 프로세스를 종료합니다. -id p는 pid가 p인 프로세스를 의미합니다. 즉, 1번째 명령어는 pid가 21000인 프로세스의 정보를 얻어오고, 2번째 명령어는 pid가 21000인 프로세스를 종료합니다.

 


  이제, 서로 다른 탭에서 django server를 각각 실행하였습니다.

 

 만약에 8000번을 수신 포트로 쓰는 모든 프로세스를 종료하려면 어떻게 해야 할까요? 리소스 모니터에서 일일히 확인하는 방법이 있을 겁니다. 그런데, 사실 8000번을 수신 포트로 쓰는 모든 프로세스를 없애는 작업을 자동화 시킬 수 있는 더 좋은 방법이 있습니다. 아래 명령어를 보겠습니다.

 

 

 먼저, Tcp 프로토콜을 쓰는 경우, Get-NetTcpConnection 명령어를 이용하면 됩니다. 제 로컬의 8000번을 이용하니, -LocalPort 옵션을 줍니다. 괄호 안에 있는 것은 로컬 port 8000번으로 tcp 연결을 수신하는 프로세스를 검색하라는 의미입니다. owningproces는 pid 값을 의미합니다.

 

 결과를 보니까 10408이 나왔습니다. 10408번 프로세스가 로컬 port 8000번으로 tcp 프로토콜을 이용한다? 정도로 보시면 됩니다.

 

 이 -id 값을 얻어왔다면, Stop-Process 명령어가 실패할 때 까지, 계속 실행시켜 주면 됩니다.

 


 udp를 쓰는 경우에는 어떻게 하면 될까요? 49664번 포트를 쓰고, 프로토콜이 UDP인 것은 3904번 프로세스네요. powershell 에서는, Get-NetUDPEndpoint라는 명령어를 이용하면 됩니다.

 

 

 49664번 포트를 쓰는 것은 3904번 프로세스입니다. 이 프로세스를 종료하고 싶다면 Stop-Process에 -id 옵션을 주면 됩니다. 명령어는 Stop-Process -id (Get-NetUDPEndpoint -LocalPort 49664).OwningProcess 정도가 되겠습니다.