CONHOST.EXE가 실제로 필요한 경우는 언제입니까?


23

배경

작년에 나는 플래시 드라이브에서 실행할 수있는 휴대용 블로그 / 웹 서버 시스템을 컴파일했다. 훌륭하고 특히 XP에서 훌륭하게 작동합니다. 문제는 Windows 7에서 실행될 때 각 콘솔 프로그램 이 프로세스 자체와 사본 프로세스를 생성 한다는 것입니다 conhost.exe.

문제

휴대용 블로그 시스템의 경우 각 서버 구성 요소 (MySQL mysqld.exe, Apache의 인스턴스 httpd.exe, VisualSVN의 두 인스턴스 visualsvnserver.exe및 PHP의 여러 인스턴스 php-cgi.exe)는 각각의 인스턴스를 생성합니다 conhost.exe. 현재 ( php-cgi.exe활성 복사본이 conhost.exe없으면 CPU 사이클을 사용하지 않고 실제 프로세스가 현재 사용하는 80MB 외에도 22MB의 메모리를 사용하는 5 개의 인스턴스가 실행 중입니다.

연구

윈도우 7이 출시 된 (내가 비스타 이후 아마도 생각) 때문에, 나는 알아 내기 위해 노력 여러 차례이 정확히 다양한 (신규) 호스트 프로세스 (예를 들어, 어떤 목적으로 conhost.exe, dllhost.exe그리고 taskhost.exe) 수행 여부 그들은 실제로 필요합니다. 나는 그들을 죽이려고 시도했지만 콘솔 창을 사용하는 프로그램과 서버와 같이 사용하지 않는 프로그램 모두에서 콘솔 프로그램이 계속 작동한다는 것을 알았습니다.

나는 이미 전체 csrss.exe⇨ Windows Vista ⇨에conhost.exe 대해 잘 알고 있으며 동일한 (거의 그대로) 설명을 여러 번 보았습니다 . 문제는 모든 사람들이 도움이되지 않는 동일한 설명을 복사하여 붙여 넣는 것입니다. XP-, "호스트"또는 "실행"이라는 콘솔 응용 프로그램에서는 csrss.exeWindows 7에서는 conhost.exe보안 을 위해 콘솔 응용 프로그램 으로 이동했습니다 . 보안 측면은 의미가 있지만 호스팅의 의미 또는 필요한 이유 / 필요한 경우 (또는 필요하지 않은 경우이를 피할 수 있는지 여부)에 대해서는 언급하지 않습니다. 이 문제에 대한 Raymond Chen의 토론 조차도 콘솔 앱이 전혀 다르게 호스팅되는 이유를 설명합니다.

상세하고 기술적 인 설명을 찾을 수있는 가장 가까운 것은 Microsoft 블로그 게시물 이며 콘솔 응용 프로그램의 GUI 및 창에 대한 아이디어를 강화하는 것 같습니다. 이로 인해 conhost.exe이러한 서버와 같은 창없는 프로그램이 필요한지 더 궁금해 합니다. 창이 전혀 없다면 왜 자원을 낭비하고 불필요한 프로세스로 프로세스 공간을 어수선해야합니까? Windows가 불필요한시기를 감지하여 피할 수없는 이유 SecurityMatt의 응답 은 기술적 인 설명과 관련하여 약간 유용했지만, 내가 찾고있는 정보가 충분하지 않습니다.

의 불필요한 인스턴스를 중지하는 방법을 알아 낸 유일한 사람은 아닙니다 conhost. 이 사람이 기능을 비활성화하는 것에 대해 물었고 더 이상 노력하거나 생각하지 않고 단순히 "불가능"하다고 들었습니다. Hugh D“Hardly a feature” 는 하위 프로세스가 종료 된 후 리소스 사용량 및 느린 인스턴스를 포함하여 conhost(적어도 csrss하나의 사본 만 실행 된) 수많은 중복 인스턴스의 문제를 지적했습니다 . Laufer는 필요한지 여부에 대해 질문했습니다.

관찰 및 솔루션 시도

그들이 실제로 항상 필요하지 않은 경우 (다시 말해서, 그들을 죽이는 악영향을 본 적이 없다면) 서버를 서버를 실행하는 배치 파일로 대체하여 문제를 해결할 수 있다고 생각합니다. , 기다렸다가 conhost실행되도록 하는 사본 을 종료하십시오. 물론 이것이 어느 것인지 결정하는 빠르고 쉬운 방법이 필요합니다. FallenGameRconhost.exe 은 주어진 PID의 콘솔 프로그램과 관련된 인스턴스를 얻는 방법을 물 었지만 답변을 얻지 못했습니다. 부모 프로세스의 PID를 검색하면 트릭을 수행해야한다고 생각합니다 (No. ProcessExplorer는 옵션이 아니며 자동화 된 스크립트 가능해결책이 필요합니다). 그러나 단순히 PID를 실행하고 작업을 수행하는 대신 자녀의 PID를 얻기 위해 일종의 프레임 워크를 만들어야 할뿐만 아니라 호환 가능한 방법을 찾는 것을 의미합니다. XP에서도 마찬가지입니다 (예 : 부모 프로세스의 이미지 이름 확인). 이 블로그 게시물은 한 가지 방법을 제공하지만 PowerShell이 ​​필요하며 스크립트를 실행 한 결과에 대한 언급은 말할 것도없고 이상적입니다.

질문

아마도 Microsoft는 아무도 더 이상 명령 프롬프트를 사용하지 않으므로 (* cough * Windows 8 * cough *) 부담을 줄 필요가 없다고 가정했지만 여러 콘솔 응용 프로그램이 실행되고 각각 하나씩있는 시나리오가 있습니다. 메모리를 많이 사용하는 PID를 사용하는 추가 프로세스가 끔찍하기 때문에 문제를 해결하는 것은 매우 불편합니다.

아무도 그 문제에 대한 결정적이고 권위있는 정보를 가지고 있습니까? 다시 한 번 나는 일반적인 설명을 읽었습니다. 궁금:

  1. 콘솔 응용 프로그램을 전혀 다르게 처리해야하는 이유
  2. 어떤 특정 상황에서 그들이 필요로 가지고conhost
  3. 살해 의 결과conhost
  4. 이를 중지 / 예방 / 비활성화 / 차단할 수있는 방법이 있거나 최소한 쉽게 후미를 처리 할 수있는 방법이 있습니까?

1
누군가가 그것에 연결하기를 귀찮게하기 전에 (또는 그것을 복제하여 닫으려면 투표하십시오. 나는 이미 [이 질문]과 같은 다른 질문을 보았습니다). 내가 말했듯이, 파일을 창없는 콘솔 응용 프로그램으로 끌어서 놓는 것은 관련이 없으므로 왜 conshost.exe여전히 생성됩니까?
Synetech

1
내가 읽은 것에서 문제의 일부는 Windows가 * nix와 같은 콘솔을 처리하지 못한다는 것입니다. 그것들은 단순히 문자 장치가 아니며 전혀 상호 운용이 불가능합니다 (PuTTY 기능 요청에 따라 PuTTY를 로컬 명령 터미널로 사용하도록 지원하는 것에 대해 매우 좋은 토론이 있습니다). 나는 항상 그것이 conhost.exeWindows의 PTY와 동등한 것으로 생각 cmd.exe했으며 껍질이었습니다.
Darth Android


@ techie007, 위의 내 의견 에서 링크를 시도한 페이지입니다 .
Synetech

답변:


19
  1. 콘솔 응용 프로그램은 NT 커널 (모든 2000, XP, Vista, Windows 7 및 Windows 8에 해당)에서 2 등급 시민이므로 다르게 처리해야합니다. 유닉스 시스템 아키텍처에서, 생성시 모든 프로세스에는 표준 입력, 출력 및 오류 스트림이 첨부되어 있습니다. 터미널 IO는 이러한 스트림 측면에서 구현되며 (키보드에서 오는 stdout / stderr는 터미널로 이동) 이러한 스트림을 사용하지 않으려는 프로세스 부분에는 추가 노력이 필요합니다. 파일 디스크립터가 열립니다.

    VMS의 직계 후손이 거의 같은 팀에 의해 개발되지는 않았지만 Windows NT 아키텍처에서는 그 반대가 사실입니다. 새로 생성 된 프로세스에는 기본적으로 연결된 I / O 스트림이 없으며 "터미널"과 같은 개념이 없습니다. 약간 더 많은 Unixy 방식으로 동작하기를 원하는 프로그램은 시스템이 콘솔 창을 만들고 시스템에 연결된 입출력 스트림을 (컴파일 타임 선언으로) 요청할 수 있습니다. 시스템은 그렇게 할 것이지만 Windows는 Unix와 달리 터미널을 무료로 제공하지 않기 때문에 이전 csrss.exe과 현재 를 만들려면 상당한 노력이 필요합니다 conhost.exe.

    이 둘의 차이점에 대해서는 "Hardly a feature"링크가이를 적절하게 설명합니다. 요컨대, Windows 7 이전의 NT 버전에서 권한 에스컬레이션을 허용했던 Windows의 매우 독창적 인 콘솔 API의 이전 반복에서 보안 결함을 해결하기 위해 존재합니다 (Vista, FYI conhost.exe는 NT 계열의 Windows Millennium으로 선정되었습니다.)

  2. Unix stdin / stdout / stderr에 해당하는 프로그램에는 콘솔이 필요하므로 인스턴스가 필요합니다 conhost.exe. Apache, PHP 등과 같은 Unix-land 출신의 이민자들은 이러한 스트림을 원할 것입니다. 따라서 시스템은 conhost.exe실제로 창을 표시하는지 여부에 따라 시스템을 자동으로 인스턴스화 합니다. 이론적으로 터미널이 필요하지 않도록 Apache의 소스를 수정하고 콘솔 애플리케이션 대신 Windows GUI 애플리케이션으로 컴파일하여 시스템에서 소스를 생성 할 필요가 없도록 할 수 있습니다 conhost.exe. 실제로도 가능하다고 가정하면 아무도 그렇게 할만 큼 돌보지 않은 것 같습니다. 아마도 당신은 첫 번째가 될 것입니다.

  3. 주어진 conhost.exe것을 죽이면 해당 인스턴스에서 실행중인 프로세스에 대해 콘솔 IO가 거의 확실히 비활성화됩니다. 어쨌든 콘솔 IO 스트림에서 흥미로운 것을 수행하지 않는 서버 프로세스를 처리하고 있기 때문에 신경 쓰지 않을 것이므로 아마도 conhost.exes 를 죽이지 않을 이유가 없습니다 . 의심스러운 경우, 그들을 죽이고 그것이 깨지는 지 확인하십시오.

  4. conhost.exe콘솔 IO를 요청하는 프로그램이 시작될 때 Windows가 인스턴스화되는 것을 막을 방법이 없습니다 . Windows가 콘솔 응용 프로그램으로 간주하지 않도록 다시 컴파일하는 것이 유일한 방법입니다. 그러나 주어진 서버 프로세스의 부모를 죽이는 것이 conhost.exe원하는 방식으로 기능을 손상시키지 않는다고 가정하면 taskkill /f /im conhost.exe실행 프롬프트 또는 콘솔 창을 실행 하여 한 번에 모두 죽일 수 있어야합니다. 후자는 아마도 부모 conhost.exe인스턴스가 죽 자마자 죽을 것이고 거의 확실하게 작동을 멈출 것입니다 . 의심 할 여지가있는 경우에도 다시 제거하고 문제가 있는지 확인하십시오.


5
그러나 플래시 드라이브의 휴대용 서버 스택은 특정 시스템에서 실행하는 데 많은 시간을 소비하지 않는 것처럼 들리며 22M은 요즘 쉽게 구입할 수있는 최저 급 시스템의 RAM 보완의 약 1 %입니다. 이렇게 많은 시간과 노력을 들일만한 가치가있는 것입니까?
Aaron Miller

All that said, a portable server stack on a Flash drive sounds like it never spends much time running on any given machine 이것이 무엇을 의미하는지 모르겠습니다. CPU 사이클에 대해 이야기하고 있습니까? 그렇다면 웹 서버가 인기가 많으면 웹 서버가 망치질 수 있습니다 (그렇지 않은 경우에도 망치질 수 있습니다 .Windows의 PHP는 CPU 비용이 저렴하지 않습니다). 일반적으로 얼마나 자주 실행되는지를 알면 일주일 내내 랩톱에서 실행합니다.
Synetech

22M is roughly 1% of the RAM complement of the lowest-end machine you can even easily buy these days. Is it really enough of a problem to be worth this much time and effort? 새 컴퓨터에서 개인 웹 서버를 실행하지 않고 다른 시스템에는 유용하지 않은 오래된 시스템에서 실행합니다. (1997 년 한 친구가 당시 표준 시스템에 따라 구식과 최소한의 리눅스 웹 서버를 운영하고 있다고 말했다.) 이식성이 뛰어 나기 때문에 가능한 한 호환 될 수 있어야한다. 그리고 그것은 단지 메모리아닙니다 . 우선 프로세스 공간을 오염시키고 작업 관리자를 혼란스럽게 만듭니다.
Synetech

Vista, FYI, does not have conhost.exe, which is befitting of its status as the Windows Millennium of the NT family. 그렇기 때문에 Vista를 다음과 같이 사용 csrss합니다 conhost. 중간 단계였습니다. 열악한 Windows ME는 나쁜 생각이 들지 않습니다. 나는 최근 에 VMPlayer에서 XP로 실행 하여 Oracle의 Jewels를 다시 플레이했지만 Jewels II 를 플레이하려고 시도했지만 실패했습니다 . XP 또는 2000에서는 실행되지 않지만 98에서는 실행되지만 98은 VMPlayer 및 VirtualBox에서 오디오-비디오 지원이 불량합니다. 12 번의 시도 끝에 게임이 올바르게 작동하는 OS 및 VM의 유일한 조합은 VMPlayer에서 ME라는 것을 알았습니다.
Synetech

4
순서대로 : "플래시 드라이브의 휴대용 서버 스택"이 들리면 "사용자는 상자를 전용으로 사용할 수없고 컴퓨터간에 쉽게 이동할 수 있어야합니다"라고 생각합니다. 이미 VM 오버 헤드를 처리하고 있다면 Linux VM에서 웹 서버 스택을 실행하는 것이 어떻습니까? 아니 conhost.exe그런 식으로. 그리고 Windows ME의 경우, 새 것이었을 때 다시 지원하려고 노력해야했으며 하루 종일 나쁜 입을 벌일 수있는 OS의 그 개 아침 식사에 대한 내 의견을 쏟지 않고 당신이 좋아하는 불분명하고 뒤늦은 코너 사례를 모두 인용 할 수 있습니다. 정의하지 않고.
Aaron Miller

7

DETACHED_PROCESS플래그로 시작된 콘솔 응용 프로그램 은 콘솔이나 호스트 하위 프로세스를 얻습니다. 문제는 플래그가 손자에게는 적용되지 않으므로 직접 시작한 프로세스에서만 작동한다는 것입니다 (이 플래그를 지정할 수있는 유틸리티를 찾을 수있는 경우).

콘솔 프로세스가 FreeConsole()함수를 호출하는 경우 작동 할 수있는 다른 옵션이 있습니다 . 일부 서버 응용 프로그램은 -d 또는 -detach 매개 변수를 지원하지만 * nix 시스템에서 더 일반적 일 수 있습니다 ...


1
훌륭합니다. 이 페이지들 중 어느 것도 언급하지 conhost않았지만 연결은 분명합니다. 나는 어떤 종류의 효과가 있는지 확인하기 위해 몇 가지 테스트를 할 것입니다.
Synetech

2

귀하에게 적합한 빠른 솔루션. 응용 프로그램을 링크 할 때 / SUBSYSTEM : WINDOWS를 옵션에 추가하십시오. editbin.exe를 사용하여 기존 실행 파일을 수정할 수도 있습니다.

이렇게하면 응용 프로그램에서 Windows가 conhost.exe를 생성하지 못하게됩니다.


그것은 유망한 것처럼 들리지만 방금 시도했지만 작동하지 않았습니다. 에 대한 하위 시스템을 변경하는 데 사용 mysqld했지만이를 실행해도 conhost인스턴스 가 생성되었습니다 .
Synetech

그것이 stderr여전히 필요 mysqld하고 따라서 필요 conhost합니까?
David T. Macknet
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.