(Когда) действительно необходим CONHOST.EXE?

12925
Synetech

Фон

В прошлом году я собрал портативную систему для блогов и веб-серверов, которую можно запускать с флешки. Это здорово и прекрасно работает, особенно на XP. Проблема в том, что при запуске в Windows 7 каждая консольная программа порождает два процесса, сам процесс и его копию conhost.exe.

проблема

В случае переносимой системы блогов каждый из ее серверных компонентов (MySQL mysqld.exe, два экземпляра Apache, два экземпляра httpd.exeVisualSVN visualsvnserver.exeи несколько экземпляров PHP php-cgi.exe) порождает экземпляр conhost.exe. В этот момент (без php-cgi.exeактивных копий у меня есть пять экземпляров conhost.exeработы, использующих почти без циклов ЦП, но потребляющих 22 МБ памяти (в дополнение к 80 МБ, которые в настоящее время используют реальные процессы).

Исследование

Поскольку Windows 7 был выпущен (и я думаю, что, возможно, так как Vista), я на несколько раз пытались выяснить, точно какая цель различные (новый) хост - процессы (например, conhost.exe, dllhost.exe, и taskhost.exe) делать, и являются ли они на самом деле необходимо. Я попытался убить их и обнаружил, что консольные программы продолжают работать, как для программ, которые используют окно консоли, так и для тех, которые не (например, серверы).

Я уже знаком со всей « csrss.exeWindows Vista»conhost.exe и видел такое же (почти дословно) объяснение много раз. Проблема в том, что все просто копируют и вставляют то же самое объяснение, которое не помогает. Все это говорит о том, что в XP- консольных приложениях, которые «размещены» или «работают под» csrss.exe, но в Windows 7 они были перемещены в conhost.exeцелях безопасности. Аспект безопасности имеет смысл, но он ничего не говорит о том, что означает его размещение или почему / когда это необходимо (или возможно ли избежать этого, если в этом нет необходимости). Даже в дискуссии Раймонда Чена по этому вопросу скрывается, почему консольные приложения вообще размещаются по-разному.

Наиболее подробное техническое объяснение, которое я могу найти, - это сообщение в блоге Microsoft, которое, кажется, подтверждает идею о том, что речь идет только о графическом интерфейсе и окне консольного приложения. Это заставляет меня задуматься о том conhost.exe, необходимы ли такие программы без окон, как эти серверы. Если окна вообще нет, то зачем мне тратить ресурсы и загромождать пространство процессов ненужными процессами? Почему Windows не может определить, когда это не нужно, и избежать этого? Ответ SecurityMatt также был немного полезен в отношении технического объяснения, но, опять же, недостаточно информации, которую я ищу.

Я не единственный, кто пытался найти способ остановить ненужные случаи conhost. Этот человек спросил о его отключении, и ему просто сказали «это невозможно» без каких-либо дополнительных усилий или мыслей об этом. Хью Д. и «Едва ли это особенность» указали на проблему с многочисленными избыточными экземплярами conhost(по крайней мере csrss, если была запущена только одна копия), включая использование ресурсов и длительные экземпляры после завершения их дочерних процессов. Я Лауфер усомнился, / когда это даже необходимо.

Наблюдения и попытки решения

Если они на самом деле не нужны во все времена (опять же, я не видел каких-либо побочных эффектов от их убийства), то я полагаю, что мог бы (очень раздражающе) обойти проблему, заменив серверы пакетными файлами, которые запускают серверы, подожди, а потом убей копию того, conhostчто они заставляют бежать. Конечно, это требует быстрого и простого способа определить, какой это. FallenGameR спросил, как получить экземпляр, conhost.exeсвязанный с консольной программой с заданным PID, но не получил ответа. Я бы подумал, что простое получение PID родительского процесса должно помочь (нет, ProcessExplorer не является опцией, автоматизированный / скриптовыйрешение требуется), но это не только потребует создания какой-то структуры для получения PID ребенка (вместо того, чтобы просто запустить его и выполнить задачу), но это также будет означать поиск способа сделать его совместимым с XP (например, проверка имени-образа родительского процесса). Этот пост в блоге дает один способ, но он требует PowerShell и вряд ли идеален, не говоря уже о том, что он ничего не говорит о последствиях запуска скрипта.

Вопросы)

Возможно, Microsoft считает, что никто больше не использует командные подсказки (* кашель * Windows 8 * кашель *), и поэтому предположил, что не стоит их обременять, но есть определенные сценарии, когда несколько консольных приложений работают и имеют каждое из них. порождать дополнительный, требующий памяти процесс, использующий PID, ужасно, и пытаться обойти его, в лучшем случае, ужасно неудобно.

У кого-нибудь есть точная, авторитетная информация по этому вопросу? Опять же, я уже прочитал общее объяснение; Мне интересно:

  1. Почему консольные приложения должны (все еще) обрабатываться по-другому вообще
  2. При каких конкретных обстоятельствах они должны иметьconhost
  3. Каковы последствия убийстваconhost
  4. Есть ли какой-нибудь способ остановить / предотвратить / отключить / заблокировать его или хотя бы простой способ быстро справиться с ним назад?
23
Прежде чем кто-либо потрудится дать ссылку на него (или проголосовать за его повторение, я уже видел здесь другие вопросы, например [этот]). Как я уже говорил, перетаскивание файла в консольное приложение без окон не имеет значения, так почему же по-прежнему создается файл «conshost.exe»? Synetech 11 лет назад 1
Из того, что я прочитал, отчасти проблема в том, что Windows не обрабатывает консоли, как * nix. Они не просто символьные устройства и вообще не являются совместимыми (об этом очень подробно говорится в запросе функции PuTTY о поддержке использования PuTTY в качестве локального командного терминала). Я всегда считал, что conhost.exe - это Windows-эквивалент PTY, а cmd.exe - оболочка. Darth Android 11 лет назад 1
возможный дубликат процесса [что такое «conhost.exe», который отображается в диспетчере задач?] (http://superuser.com/questions/27347/what-is-the-conhost-exe-process-that-shows- до-в-целевой-менеджер) Ƭᴇcʜιᴇ007 11 лет назад 0
@ techie007, это страница, на которую я (пытался) сослаться в [моем комментарии выше] (http://superuser.com/questions/624270/624304?noredirect=1#comment776680_624270). Synetech 11 лет назад 0

3 ответа на вопрос

18
Aaron Miller
  1. Console applications must be differently handled because under the NT kernel (which underlies all of 2000, XP, Vista, Windows 7, and Windows 8) they are second-class citizens. In the Unix system architecture, every process at creation time has the standard input, output, and error streams attached to it; terminal IO is implemented in terms of these streams (stdin coming from the keyboard, and stdout/stderr going to the terminal), and extra effort is required on the part of a process which doesn't wish to make use of those streams or have their file descriptors open.

    In the Windows NT architecture, which while not a lineal descendant of VMS was developed by more or less the same team, the opposite is true; a newly spawned process by default has no I/O streams connected to it at all, and there is no such concept as a "terminal". Programs which wish to behave in a slightly more Unixy fashion may request (by compile-time declaration) that the system create for them a console window, and input/output streams connected to it; the system will do so, but since Windows, unlike Unix, doesn't give you terminals for free, a considerable amount of additional effort is required to create one, thus formerly csrss.exe, and now conhost.exe.

    As for the difference between the two, your "Hardly a feature" link explains it quite adequately; in short, it exists to work around a security flaw in the previous iteration of Windows's highly recondite console API, which allowed for privilege escalation in versions of NT older than Windows 7. (Vista, FYI, does not have conhost.exe, which is befitting of its status as the Windows Millennium of the NT family.)

  2. Any program which wants the equivalent of Unix stdin/stdout/stderr needs a console, hence an instance of conhost.exe. Immigrants from Unix-land, such as Apache, PHP, et al., are going to want these streams, hence the system's automatic instantiation of conhost.exe for them, whether they actually display a window or not. In theory, it would be possible to modify the source for e.g. Apache such that it required no terminal, and compile it as a Windows GUI application instead of a console application, so that the system wouldn't feel the need to spawn it a conhost.exe. Assuming it's also possible in practice, no one seems to have cared enough to do so. Perhaps you will be the first.

  3. Killing a given conhost.exe will almost certainly disable console IO for whatever process is running under that instance. You probably don't care about that because you're dealing with server processes that aren't doing anything interesting on the console IO streams anyway, so there's probably no reason not to kill their conhost.exes. If in doubt, kill them off and see if it breaks anything.

  4. There is no way to prevent Windows from instantiating conhost.exe when a program is launched which requests console IO; the only way to do so would be to recompile it so that Windows doesn't regard it as a console application. However, assuming that killing a given server process's parent conhost.exe doesn't impair its functionality in any way you care about, you should be able to kill them all at once by issuing taskkill /f /im conhost.exe in a Run prompt or a console window -- preferably the former, since the latter will probably die, and almost certainly cease to work, as soon as its parent conhost.exe instance is killed. Again, if in doubt, kill them off and see if it breaks anything.

При этом портативный стек серверов на флэш-диске звучит так, как будто он никогда не тратит много времени на работу с какой-либо конкретной машиной, а 22M - это примерно 1% от объема ОЗУ самой дешевой машины, которую вы можете легко купить в наши дни. Достаточно ли проблемы, чтобы стоить столько времени и усилий? Aaron Miller 11 лет назад 5
«Все это говорит о том, что портативный флэш-накопитель на флэш-диске звучит так, как будто он никогда не тратит много времени на работу на любой конкретной машине». Я не знаю, что это значит. Вы говорите о циклах процессора? Если это так, то веб-сервер может оказаться довольно забитым, если сайт достаточно популярен (и забит, даже если это не так; PHP на Windows не совсем дешевый процессор). Если вы имеете в виду, как часто он запускается, я оставляю его включенным на моем ноутбуке всю неделю. Synetech 11 лет назад 0
`22M - это примерно 1% от объема ОЗУ самого дешевого компьютера, который вы можете легко купить в наши дни. Достаточно ли проблемы, чтобы стоить столько времени и усилий? `Вы не запускаете персональный веб-сервер на новой машине, вы запускаете его на старой системе, которая больше никому не нужна. (В 1997 году один мой друг сказал мне, что он работает на веб-сервере Linux на старой и минимальной - по стандартным на тот момент - системе). Поскольку он переносим, ​​он должен быть максимально совместимым. И это * не только память *; с одной стороны, он также загрязняет пространство процессов и загромождает диспетчер задач. Synetech 11 лет назад 0
`Vista, к вашему сведению, не имеет файла conhost.exe, который соответствует его статусу Windows Millennium семейства NT. Вот почему я поставил Vista между` csrss` и `conhost`; это был средний шаг. Что касается плохой Windows ME, не отчаивайтесь. Я недавно переиграл * Jewels of the Oracle *, запустив его в XP в VMPlayer, но когда я попытался играть в * Jewels II *, я не смог. Он не будет работать в XP или 2000. Он работает в 98, но 98 имеет плохую поддержку аудио-видео в VMPlayer и VirtualBox. После десятка попыток я обнаружил, что единственная комбинация ОС и ВМ, которая позволяет игре работать правильно, была ME в VMPlayer. Synetech 11 лет назад 0
По порядку: когда я слышу «портативный серверный стек на флэш-накопителе», я думаю, что «пользователь не может выделить для него ящик и ему нужно, чтобы его легко перемещать между машинами», потому что нет другой веской причины делать это таким образом. Если вы уже имеете дело с виртуальными издержками, почему бы просто не запустить свой стек веб-серверов на виртуальной машине Linux? Нет `conhost.exe` таким образом. А что касается Windows ME, мне пришлось постараться поддержать ее, когда она была новой, и вы можете привести все неясные, запоздалые угловые случаи, которые вам нравятся, не нарушая моего мнения о том, что эта собака завтракает с ОС, которую я мог ругать весь день. не делая это справедливости. Aaron Miller 11 лет назад 4
@Synetech Обновлен ответ, включающий больше информации о различиях между моделями ввода-вывода Unix и Windows, так что вопрос "почему` conhost.exe`? " теперь получает предметный ответ вместо выброшенных «граждан второго сорта»; последнее достаточно точно, но не хватает деталей. Aaron Miller 11 лет назад 0
«Когда я слышу« портативный серверный стек на флэш-накопителе », я думаю, что« пользователь не может выделить для него ящик и ему нужно, чтобы его легко перемещать между машинами », потому что нет другой веской причины делать это таким образом. правда. Я создал его в первую очередь, потому что я больше не использовал только одну систему, поэтому мне нужно было, чтобы она присутствовала в любой системе, которую я использовал в то время. В конце концов я перенесу его на Raspberry Pi, но все равно буду держать его портативным. Я не запускаю сервер в виртуальной машине, просто Jewels 2 в ME. Спасибо за техническое объяснение. Я проведу несколько тестов, чтобы выяснить, когда можно убить его. Synetech 11 лет назад 0
@Synetech "... потому что я больше не использовал только одну систему, поэтому мне нужно было, чтобы она присутствовала на любой системе, которую я использовал в то время" == "пользователь не может выделить для нее ящик и ему нужен легко перемещается между машинами ". Aaron Miller 11 лет назад 0
`пользователь не может посвятить ему коробку`… больше. (По крайней мере, пока я не получу Rπ.) Несмотря на это, это не имеет никакого отношения к желанию избежать посторонних процессов. Даже на выделенной системе вы хотели бы сохранить ее стройной и оптимальной. Synetech 11 лет назад 0
позвольте нам [продолжить это обсуждение в чате] (http://chat.stackexchange.com/rooms/9835/discussion-between-aaron-miller-and-synetech) Aaron Miller 11 лет назад 0
@Synetech Перенес обсуждение в чат, если хотите продолжить; автоматически сгенерированный комментарий выше этого содержит необходимую ссылку. Aaron Miller 11 лет назад 0
`Вы работаете на сильно устаревшем оборудовании? Возможно, вам стоит подумать о том, чтобы заменить его чем-то более новым, Джи, почему я не подумал об этом? Пришлите мне чек на новое оборудование, и я обновлю posthaste. `Или ты просто одержим этой темой? Найти что-то, чем можно заняться, это, по крайней мере, продуктивно для чего-то более полезного, чем короткий список процессов в диспетчере задач. Это именно та ситуация, которая заставляет Windows раздувать и запускать десятки ненужных процессов, а играм требуются суперкомпьютеры и 50 ГБ. Synetech 11 лет назад 0
@Synetech Да, я помню, как это было до того, как я получил работу, которая платит мне нечто большее, чем я стою. Держись, детка! Когда-нибудь это станет лучше, если не будет. Aaron Miller 11 лет назад 0
Я был шутливым. Моя точка зрения заключалась в том, что вы не можете решить все, просто бросая на это деньги; простое обновление только скрывает симптомы, но не решает проблему. Конечно, вы можете играть в * Rage *, если купите систему стоимостью 3000 долларов США с дисками i7, HD 7000 и 2 ТБ, но это не означает, что она * нуждается * в ней, когда много хороших (даже лучших) игр сделали с * намного * меньше (да, я преувеличивал для акцента ... немного). Synetech 11 лет назад 0
@ Synetech Я полагаю, это зависит от того, что вы подразумеваете под «решить»; когда это связано с потерей денег или времени, я чаще всего совершенно счастлив потратить деньги, если они у меня есть, и продолжать свою жизнь. Полагаю, я когда-то чувствовал себя по-другому, но вы будете удивлены, какое влияние на вашу перспективу может оказать то, что вы потратите почти десятилетие, выполняя работу сисадмина на жизнь - дни, когда я находил такие задачи интересными или приятными, долгие позади меня, и никогда не было дней, когда я проявлял интерес к философской оценке требований к оборудованию для игр ААА. Aaron Miller 11 лет назад 0
Я имею в виду традиционное определение. Если пол грязный, вы можете «решить» его, накинув ковер на пол, но это на самом деле не решает проблему, а лишь скрывает признак, который является именно тем, что вы делаете, игнорируя его или «получая лучшее оборудование». »(Что, к сведению, не является допустимым решением, поскольку оно исключает встроенные системы и тому подобное - и да, вы * можете * запускать современные Windows на встроенных системах). Synetech 11 лет назад 0
@ Synetech Вы имеете в виду * идеальное * определение. Конечно, было бы неплохо жить в идеальном мире. Aaron Miller 11 лет назад 0
Нет, * стандартное * определение, которое всегда включает в себя такие слова, как «правильный» или «эффективный», но никогда не «достаточно хороший». Просто надейся, что у тебя никогда не будет болезней, и найди доктора, который думает как ты; они дадут тебе консилер и отправят в путь. Synetech 11 лет назад 0
Крайне поздно к комментарию игра, но весь этот вопрос и ответ был очень информативным. Есть ли способ определить, для какого процесса выполняется конкретный экземпляр csrss / connhost? Nicholi 8 лет назад 0
@Nicholi Ничего из этого я не знаю, извините. Aaron Miller 8 лет назад 0
6
Anders

A console application started with the DETACHED_PROCESS flag does get a console nor a conhost child process. The problem is that the flag does not apply to grand-children so it will only work with the processes you start directly (if you even can find a utility that allows you to specify this flag).

The other option that might work is if the console process calls the FreeConsole() function. Some server applications support a -d or -detach parameter but this is probably more common on *nix systems...

Это звучит великолепно. Ни на одной из этих страниц не упоминается `conhost`, но связь кажется достаточно ясной. Я сделаю несколько тестов, чтобы увидеть, какие эффекты это имеет. Synetech 10 лет назад 0
1
HarryTheDev

Быстрое решение, которое может работать на вас. При связывании вашего приложения добавьте / SUBSYSTEM: WINDOWS к параметрам. Вы также можете использовать editbin.exe для изменения существующего исполняемого файла.

Это предотвращает появление Windows conhost.exe для вашего приложения.

Это звучало многообещающе, но я просто попробовал, и это не сработало. Я использовал его, чтобы изменить подсистему на `mysqld`, но когда я запустил ее, она все равно породила экземпляр` conhost`. Synetech 11 лет назад 0
Может ли быть так, что `stderr` все еще требуется для` mysqld` и, следовательно, ему нужен `conhost`? David T. Macknet 8 лет назад 0