죽은 프로세스로 열린 포트를 어떻게 확보합니까?


63

내 동료가 최근에 사망 한 프로세스가 여전히 네트워크 포트에 바인딩되어 다른 프로세스가 해당 포트에 바인딩되는 것을 막는 문제가 발생했습니다. 특히 PID 4476으로 netstat -a -b명명 된 프로세스 System가 포트 60001을 열었다 고보고했습니다 .PID 4476이 있는 프로세스 는 적어도 내가 알 수있는 한 존재하지 않습니다.

프로세스 탐색기 및 작업 관리자는 PID 4476을 나열하지 않았습니다 ( SystemPID 4 라는 이름의 다른 프로세스 가 있었지만 60001을 포함하지 않는 자체 TCP 연결 세트를 가짐). taskkill /PID 4476또한 PID 4476을 찾을 수 없다고보고했습니다.

이 신비한 시스템 프로세스를 종료하여 현재 바인딩 된 포트를 비울 수있는 방법이 있습니까? 이것이 일어날 수있는 원인은 무엇입니까? 작업 관리자, 프로세스 탐색기 및 태스크 킬 중 누구도 모르는 프로세스가 어떻게있을 수 있습니까? 재부팅하면 문제가 해결되었지만 재부팅하지 않고 해결할 수있는 방법이 있는지 알고 싶습니다.


포트가 해제되었는지 확인하기까지 얼마나 걸립니까? 연결 (포트) 상태는 무엇입니까? 설립, 폐쇄, Time_Wait?
— joeqwerty

@joeqwerty : 최소 15-20 분을 기다렸습니다. 불행히도 연결 상태가 = /인지 잊어 버렸습니다.
— Adam Rosenfield

20 분은 문제처럼 들린다. 다음에 netstat를 실행하고 연결 상태를 확인하면 무슨 일이 일어나고 있는지 알 수 있습니다. mfinni의 답변에 댓글을 달았을 때 소프트웨어 \ 서비스 충돌의 결과 일 수 있습니다.
— joeqwerty

답변:


58

나는 이것이 오래된 스레드라는 것을 알고 있지만 다른 사람이 같은 문제를 겪고있는 경우에 나는 ...

일어날 수있는 일은 프로세스가 명시 적으로 닫히지 않고 충돌하거나 종료 될 때 TCP 포트가 열려 있다는 것입니다. 일반적으로 OS는 프로세스 레코드가 사라질 때만 이러한 종류의 것들을 정리합니다. 프로세스가 더 이상 실행되지 않는 것처럼 보일 수 있지만 PID 재사용을 방지하기 위해 레코드를 유지할 수있는 방법이 적어도 하나 있습니다. 이것은 부모로부터 분리되지 않은 자식 프로세스의 존재입니다.

프로그램이 실행되는 동안 프로세스를 생성 한 경우 종료하십시오. 프로세스 레코드가 해제되고 TCP 포트가 정리됩니다. 분명히 예상대로 프로세스가 종료되지 않을 때 레코드가 해제되면 Windows 가이 작업을 수행합니다.


1
고마워요 특히 Google 쿼리 에이 경우에는 도움이되지 않는 "TCP 사용 / netstat 및 taskkill 사용"이라는 답변이 채워져 있기 때문에이 답변이 너무 낮다고 믿을 수 없습니다. 제 경우에는 ProcessExplorer를 실행하고 고아가 된 프로세스를 찾는 데 도움이되었습니다. 종료하면 문제가 해결되었습니다.
— gwiazdorrr

3
힌트 주셔서 감사합니다 !! 고아 프로세스를 종료하면 실제로 문제가 해결되었습니다.
— 다크 스레드

감사!! 이것이 바로 나에게 일어난 일이었습니다. 고아 프로세스를 종료하고 포트가 해제되었습니다. 프로세스 탐색기를 사용하여 고아 프로세스를 검색하는 방법을 모르겠지만 생성 된 프로세스의 이름을 알기 쉽기 때문에 쉽게 찾을 수 있습니다.
— Grezzo

1
우리도 이와 동일한 문제를 겪었습니다. 프로세스 탐색기를 사용하여 Dr. Watson이 이전 PID를 유지하고 있음을 알았습니다. 서비스가 열려고하는 포트를 (찾기) 검색 한 후 Dr. Watson 및 사용중인 PID에 대한 3-4 개의 항목을 보았습니다. 이상하게도, 우리는 암묵적으로 아무것도 죽일 필요가 없었습니다. 그 과정이 '일어났다'고 사라졌습니다. 다음에 서비스를 다시 시작하려고하면 문제가 발생했습니다.
— tresstylez

VS로 디버깅하는 동안 비슷한 문제가 발생할 수 있습니다. VS를 프로세스에 연결하고 일부주기 후에 설명 된 상황이 발생하지만 내 프로세스 (자식 포함)가 떠나지 않습니다. 그러나 "vsjitdebugger"를 죽이면 도움이됩니다.
— Dmitry Azaraev

6

TCPView를 사용하고 연결을 닫으셨습니까? 설명하지 않은 시나리오에서 연결이 표시되는지 여부는 알 수 없습니다. 그러나 이것이 다시 발생하면 내가 생각할 수있는 유일한 것입니다.

프로세스는 무엇 이었습니까? 상용 소프트웨어입니까, 아니면 자체 개발 한 것입니까? 포트 60001은 일부 트로이 목마에 의해 사용되는 것으로 보입니다. 루트킷 일 수도 있고 OS에서 자신을 숨길 수있는 것일 수 있습니까? 부팅 가능한 미디어의 AV 일 수 있으므로 AV를 통해 한 번에 좋은 시스템을 제공 할 수 있습니다.


우리는 TCPView를 시도하지 않았습니다. 나는 그것이 다시 일어날 경우 미래에 대해 명심할 것이다. 이 소프트웨어는 포트 60001을 사용하는 사내 소프트웨어입니다. 포트를 열린 상태로 유지하는 프로세스가 완전히 죽지 않은 이전 소프트웨어 사례 일 것입니다. 이로 인해 소프트웨어의 다른 사본이 시작되지 않았습니다.
— Adam Rosenfield

애플리케이션은 소켓의 SO_REUSEADDR 옵션을 바인딩하기 전에 true로 설정할 수 있습니다. 문제를 해결해야합니다 (* nix에서는 다소 의무적 임)
— Stephane

3

관리자 권한으로 명령 프롬프트 열기

  1. C : \ WINDOWS \ system32> netstat -ano | findstr : 7895

*** 더 이상 하위 프로세스가 없을 때까지 2 단계를 반복하십시오.

  1. C : \ WINDOWS \ system32> wmic 프로세스 (ParentProcessId = 1091)가 캡션, ProcessId를 얻는 경우

    캡션 프로세스 아이디

    cmd.exe 1328

2.a. C : \ WINDOWS \ system32> (ParentProcessId = 1328)가 캡션, ProcessId를 얻는 wmic 프로세스

  Caption  ProcessId

  conhost.exe  1128

2.b. 더 이상 자식 프로세스를 찾을 수 없을 때까지 이것을 반복하십시오

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

  1. C : \ WINDOWS \ system32> taskkill / F / PID 1128 성공 : PID 9500의 프로세스가 종료되었습니다.

wmic 명령은 포트를 열어 둔 상태에서 자식 프로세스를 식별 할 수있는 유일한 방법이었습니다. 많은 감사합니다.
— K Erlandsson

이것은 또한 내 문제를 해결하는 유일한 방법이었습니다. 기본 프로세스가 중단되었고 하위 프로세스가 일시 중단 상태에 있었지만 여전히 "듣기"상태의 TCP 포트를 보유하고있었습니다. 감사합니다.
— Gui

1

netstat -a -n windows 명령으로 프로세스 ID가있는 열린 포트 목록을 제공했습니다. 그로부터 연결을 닫고 싶었던 포트 번호를 선택한 다음 TCPView 소프트웨어를 사용하여 해당 연결을 닫았습니다. 이것은 나를 위해 일했습니다.


-4

Windows 사용자 인 경우 아래 단계 1을 수행하십시오.이 경로로 이동하십시오. 제어판 \ 모든 제어판 항목 \ 관리 도구

2 단계 : 서비스 클릭

3 단계 : 원하는 포트에서 원하지 않는 서비스를 중지하십시오.


-5

ps -ef | grep 프로세스 이름

관련 프로세스를 종료

-9 pid pid를 죽여라

내 경우에 일했다


6
이 질문은 Linux가 아닌 Windows에 관한 것입니다.
— longneck
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.