죽었지 만 듣고있는 프로세스를 어떻게 죽이나 요?


48

포트 3000에서 수신 대기하는 응용 프로그램을 개발 중입니다. 포트를 시작할 때마다 포트를 이미 수신하기 때문에 리스너 (C #, TcpListener이지만 관련이 없음)를 만들 수 없기 때문에 여전히 포트를 수신하는 인스턴스가 있습니다. 찍은.

이제 응용 프로그램이 작업 관리자에 존재하지 않으므로 PID를 찾아서 죽이려고 시도하여 다음과 같은 흥미로운 결과를 얻었습니다.

C:\Users\username>netstat -o -n -a | findstr 0.0:3000
   TCP    0.0.0.0:3000           0.0.0.0:0              LISTENING       3116

C:\Users\username>taskkill /F /PID 3116
ERROR: The process "3116" not found.

나는 전에이 행동을 보지 못했고 누군가가 해결책을 가지고 있는지 알기에 충분히 재미 있다고 생각했습니다.

업데이트 : Process Explorer를 시작하고 3000을 검색하여 다음을 발견했습니다.

<Non-existent Process>(3000): 5552

마우스 오른쪽 버튼으로 클릭하고 "핸들 닫기"를 선택했습니다. 더 이상 Process Explorer에 없지만 netstat에 계속 표시되고 앱이 리스너를 시작하지 못하게합니다.

업데이트 2 : 프로세스를로 표시하는 Windows 용 TCPView를 찾았습니다 "<non-existent>". CurrPorts와 마찬가지로이 도구에서 연결을 닫으려고해도 아무 반응이 없습니다.


환자를 죽임으로써 질병을 치료할 수 있지만 컴퓨터를 다시 시작하면 중단됩니까?
Xantec

2
실제로, 로그 아웃했다가 다시 로그인하는 것으로 충분했지만 이제는 더 나은 솔루션을 찾고자하므로이를 재현했습니다 ...
Srekel

여기에 나열된 프로그램이 도움이 되는지 확인하십시오
Sathyajith Bhat

1
<non-exsitent> 프로세스의 컨텍스트 메뉴에서 현재 버전의 TCPView 3.05 "연결 닫기"를 사용하면 필자의 경우 연결이 닫히고 포트가 해제되었습니다.
Ventzy Kunev

답변:


13

소켓에서 끝없는 대기를 피하려면 프로그램 에서 SO_REUSEADDR 및 SO_RCVTIMEO 매개 변수와 함께 setsockopt 함수 를 사용해야합니다 .

SO_REUSEADDR : Allows the socket to be bound to an address that is already in use.
SO_RCVTIMEO : Sets the timeout, in milliseconds, for blocking receive calls. 

1
이것은이 특정 문제 (죽은 프로세스에 의한 소켓 청취)를 가진 사람에게 도움이 되었습니까?
rustyx

12

우리는 같은 문제가 있었고 더 이상 존재하지 않는 프로세스 ID를 찾기 위해 Microsoft Sysinternals의 프로세스 탐색기 를 사용 했습니다.

이 프로세스는 여러 DrWatson 프로세스에서 참조 된 것으로 나타났습니다. 이러한 프로세스를 종료하면 포트가 해제됩니다. DrWatson은 메모리 덤프를 Microsoft에 전송하는 데 사용되었으며 충돌 한 프로세스가 당시 수십 GB의 메모리를 보유했기 때문에 몇 시간이 걸렸습니다.


7

CurrPorts 를 사용해 보아야한다고 생각합니다

CurrPorts는 로컬 컴퓨터에서 현재 열려있는 모든 TCP / IP 및 UDP 포트 목록을 표시하는 네트워크 모니터링 소프트웨어입니다. 목록의 각 포트에 대해 프로세스 이름, 프로세스의 전체 경로, 프로세스 버전 정보 (제품 이름, 파일 설명 등)를 포함하여 포트를 연 프로세스에 대한 정보도 표시됩니다. 프로세스가 작성되었고 프로세스가 작성된 사용자.

또한 CurrPorts를 사용하면 원하지 않는 TCP 연결을 닫고 포트를 연 프로세스를 종료하고 TCP / UDP 포트 정보를 HTML 파일, XML 파일 또는 탭으로 구분 된 텍스트 파일에 저장할 수 있습니다.

CurrPorts는 또한 식별되지 않은 응용 프로그램 (버전 정보 및 아이콘이없는 응용 프로그램)이 소유 한 분홍색의 의심스러운 TCP / UDP 포트로 자동 표시합니다.

대체 텍스트


4
프로세스 이름 "시스템"아래의 목록에 표시됩니다. 포트를 강제로 닫으려면 항목을 마우스 오른쪽 버튼으로 클릭했지만 아무 일도 일어나지 않습니다.
Srekel

7

가능한 문제점은 프로세스가 소켓 핸들을 상속 한 다른 (하위) 프로세스를 시작했지만 여전히 실행 중이라는 것입니다.

이를 방지하는 방법에는 여러 가지가 있습니다. ProcessStartInfo.UseShellExecute = true;


1
고마워, 이것은 좋은 것이었다. subprocess.call(..., cwd=..., shell=True)파이썬 웹 서버에서 앱 런처 로 전화 하고 있었고 소켓을 해제하기 위해 모든 하위 프로세스를 종료해야한다는 것이 밝혀졌습니다. 이상한 것은 내가 shell = True를 사용하고 있다는 것입니다. 이것은 나에게 오랫동안 화가났다.
Daniel F

쉘을 사용하면이 동작이 발생한다고 생각하지 않습니다. 상위 다이, 나는 올바른 방법은 만드는 것입니다 생각하면 모든 자식 프로세스를 종료하려면 작업 개체JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 플래그를 , 각 자식 프로세스를 추가 AssignProcessToJobObject , 그리고 가까운 자연스럽게 때 부모 프로세스가 종료를 핸들 할 수 있습니다.
qris


1

netstat 명령에 '-b'플래그를 던지십시오. 포트를 사용하는 실행 파일의 이름을 알려줍니다. 그런 다음 작업 관리자에서 해당 proc을 찾아서 죽이십시오. 그래도 작동하지 않으면 포트를 열어 둔 실행 파일을 게시하십시오.


나는 현재 그것을 재현 할 수 없지만 프로세스 이름을 찾으려고 시도하는 다른 모든 시도 (및 도구)가 실패했기 때문에 netstat도 그것을 수행 할 수 없었을 것이라고 확신합니다.
Srekel

1

용어 언급 할 필요 링거를 여기에.

자세한 내용은 http://msdn.microsoft.com/en-us/library/ms739165.aspx 에서 확인할 수 있습니다 .

요약 : 보내지 않은 데이터가있는 경우 소켓을 닫은 후에도 소켓 시스템을 열어 두도록 소켓 시스템에 지시하는 옵션이 있습니다.

C # 앱에서 Socket.SetSocketOption을 통해 관련 옵션을 지정할 수 있습니다. http://msdn.microsoft.com/en-us/library/1011kecd.aspx

언급 된 모든 내용은 전송 및 클라이언트와 관련이 있지만 직장에서 비슷한 문제가 있었으므로 일부 추가 검색은 여기 예제에 표시된 것처럼 리스너에 대한 느린 옵션을 지정할 수 있음을 밝혀 냈습니다 : http://msdn.microsoft.com /library/system.net.sockets.tcplistener.server.aspx

일부 동료들은 응용 프로그램 종료 / 종료 후 약 2 분 동안 OS가 보유한 포트에 대해 이야기했습니다. 이를 감안하면 일정 시간이 지난 후에도 포트가 여전히 유지되는지 여부를 듣는 것이 흥미로울 것입니다.


포트는 그보다 훨씬 더 오랫동안 열려있었습니다.
Srekel

느린 옵션 이이 특정 사례와 관련이 있는지 확실하지 않습니다 .CloseSocket을 호출 한 후 발생할 일만 지정하는 것 같습니다. 응용 프로그램을 죽이고 있기 때문에 함수가 호출되는지 의심 스럽습니다 (?).
Srekel

1

또한이 문제가 발생합니다. 마침내 나는 내 이유를 찾았습니다. 그것은 주요 프로세스가 c / c ++에서 popen에 의해 자식 프로세스를 호출했기 때문에 발생합니다. 그러나 pclose를 호출하기 전에 주요 프로세스 충돌 / 종료. 그런 다음 포트는 기본 프로세스를 계속 처리하고 계속 청취합니다.


1
도움이되는 ServerFault에서이 답변을 찾았습니다. serverfault.com/a/273727/8856
Harriv

1

xdebug와 동일한 문제가 발생하여 포트 9000이 열려 있습니다.

"taskkill / pid xxxx"를 사용하여 cmd로 닫았습니다.

포트를 사용하는 프로세스의 pid는 "netstat -o"로 검색 할 수 있습니다.

내 구성은 7 홈 프리미엄을 이겼습니다.


1

나는 같은 문제가 있었고 다음과 같이 수정했다.

  • 로 PID 찾기 netstat -o
  • 프로세스 XP로 죽여라

netstat가 때때로 pid를 반환하지만 해당 실행 파일 이름은 반환하지 않습니다.


1

사용 불가능한 프로세스가 하나 이상의 하위 프로세스를 시작한 경우 문제점이 발생할 수 있습니다. 만약

BOOL WINAPI CreateProcess(
_In_opt_    LPCTSTR               lpApplicationName,
_Inout_opt_ LPTSTR                lpCommandLine,
_In_opt_    LPSECURITY_ATTRIBUTES lpProcessAttributes,
_In_opt_    LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_        BOOL                  bInheritHandles,
_In_        DWORD                 dwCreationFlags,
_In_opt_    LPVOID                lpEnvironment,
_In_opt_    LPCTSTR               lpCurrentDirectory,
_In_        LPSTARTUPINFO         lpStartupInfo,
_Out_       LPPROCESS_INFORMATION lpProcessInformation
);

자식 프로세스를 시작하는 데 사용되었으므로 상속 핸들의 값에 따라 달라집니다.

bInheritHandles = false 

상위 프로세스가 중지되고 클라이언트 프로세스가 여전히 실행중인 경우 Windows는 포트를 차단하지 않습니다.


1

근본 원인이 포트를 상속하는 일부 하위 프로세스가 생성되었을 때 비슷한 문제가 발생했으며 하위 프로세스가 여전히 포트를 보유하는 동안 상위 프로세스가 충돌했습니다. 해결 방법은 여전히 ​​실행중인 하위 프로세스를 식별하고 중지하는 것입니다. 이 예에서 기존 프로세스가 아닌 PID는 7336입니다.

> wmic process get processid,parentprocessid | findstr/i 7336
7336             23828

이 프로세스를 중지하려면

> taskkill /f /pid 23828

그리고 이것은 문제를 해결했습니다.


0

방화벽이 설치되어 있거나 Windows 네트워킹 tweek를 시도했다고 가정하지 않습니까?

일부 방화벽은 이러한 종류의 동작을 나타내며 포트를 열어 둘 수 있습니다.

하나가 있으면 비활성화하고 프로그램을 시작한 다음 닫고 어떻게되는지보십시오.


내 컴퓨터의 방화벽을 제어 할 수 없기 때문에 불행히도 옵션은 아닙니다.
Srekel

@Srekel-방화벽은 무엇입니까? 당신이 문제를 겪고있는 동안, 나는 개인적으로 그것이 문제를 일으키는 것이라고 생각합니다.
William Hilsum

0

프로세스가 시스템으로 나열되어 있으므로 "시스템"명령 프롬프트에서 프로세스를 종료 할 수 있습니다. 시스템 계정에는 일반 관리자보다 더 많은 권한이 있습니다.

cmd.exe (스케줄러가 시스템으로 실행 됨)에 대한 작업을 예약하여 "시스템"cmd.exe를 얻을 수 있습니다.

at 15:23 /interactive "cmd.exe" 

가까운 미래에 무언가를 위해 그 시간을 바꾸십시오. 머신 콘솔에 있는지 확인하십시오 (정기 터미널 서버 세션에있는 경우 새 cmd.exe가 표시되지 않습니다. mstsc콘솔에 로그인하십시오). 다른 방법이 있다고 생각하지만 과거에는 저에게 효과적이었습니다.


0

나는이 같은 문제가 있었다. 프로세스가 중단되는 동안 프로세스가 디버깅되고 있었으며 여전히 정지 상태 인 vsjitdebugger.exe 프로세스가 계속 남아있었습니다. vsjitdebugger.exe 프로세스를 종료하면 문제가 해결되었습니다.


0

TCPView와 Process Explorer의 하이브리드 사용은 저에게 효과적이었습니다.;) 먼저 TCPView에서 포트를 사용하고있는 프로세스 ID를 살펴 보았습니다. 프로세스 탐색기에서 프로세스를 분리하고 프로세스 탐색기를 사용하여 프로세스를 종료했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.