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


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.