Фон
В прошлом году я собрал портативную систему для блогов и веб-серверов, которую можно запускать с флешки. Это здорово и прекрасно работает, особенно на XP. Проблема в том, что при запуске в Windows 7 каждая консольная программа порождает два процесса, сам процесс плюс копию conhost.exe
.
проблема
В случае портативной системы блог, каждый из своих серверных компонентов mysqld.exe
в MySQL, два экземпляра апача из httpd.exe
два экземпляра VisualSVN в о visualsvnserver.exe
и несколько экземпляров РНР php-cgi.exe
нерестится экземпляр conhost.exe
. В данный момент (без активных копий php-cgi.exe
у меня работает пять экземпляров conhost.exe
, которые используют почти без циклов ЦП, но занимают 22 МБ памяти (в дополнение к 80 МБ, которые в настоящее время выполняются фактическими процессами) с помощью).
Исследование
Поскольку Windows 7 была выпущена (и я думаю, что возможно начиная с Vista), я несколько раз пытался выяснить, для чего конкретно используются различные (новые) хост-процессы (например, conhost.exe
, dllhost.exe
и taskhost.exe
) и действительно ли они необходимы. Я попытался убить их и обнаружил, что консольные программы продолжают работать, как для программ, которые используют окно консоли, так и для тех, которые не (например, серверы).
Я уже знаком со всем csrss.exe
⇨ Windows 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, ужасно, и пытаться обойти его, в лучшем случае, ужасно неудобно.
У кого-нибудь есть точная, авторитетная информация по этому вопросу? Опять же, я уже прочитал общее объяснение; Мне интересно:
- Почему консольные приложения должны (все еще) обрабатываться по-другому вообще
- При каких конкретных обстоятельствах они должны иметь
conhost
- Каковы последствия убийства
conhost
- Есть ли какой-нибудь способ остановить / предотвратить / отключить / заблокировать его или хотя бы простой способ быстро справиться с ним назад?