Задний план
В прошлом году я собрал портативную систему для блогов и веб-серверов, которую можно запускать с флешки. Это здорово и прекрасно работает, особенно на 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
работы, использующих почти без циклов ЦП, но потребляющих 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
- Есть ли какой-нибудь способ остановить / предотвратить / отключить / заблокировать его или хотя бы простой способ быстро справиться с ним назад?
conshost.exe
все еще появляется?conhost.exe
это эквивалент Windows для PTY, и этоcmd.exe
была оболочка.Ответы:
Консольные приложения должны обрабатываться по-разному, поскольку под ядром NT (которое лежит в основе всех 2000, XP, Vista, Windows 7 и Windows 8) они являются гражданами второго сорта. В архитектуре системы Unix каждый процесс во время создания имеет стандартные потоки ввода, вывода и ошибок, связанные с ним; Терминальный ввод-вывод реализован в терминах этих потоков (stdin, поступающий с клавиатуры, и stdout / stderr, идущий к терминалу), и требуются дополнительные усилия со стороны процесса, который не желает использовать эти потоки или имеет их файловые дескрипторы открыты.
В архитектуре Windows NT, которая, хотя и не является прямым потомком VMS, была разработана более или менее одной и той же командой, верно и обратное; вновь порожденный процесс по умолчанию не имеет подключенных к нему потоков ввода-вывода, и такого понятия, как «терминал», не существует. Программы, которые хотят вести себя немного более Unixy-способом, могут запросить (путем объявления времени компиляции), что система создаст для них окно консоли и подключенные к нему потоки ввода / вывода; система будет делать это, но поскольку Windows, в отличие от Unix, не предоставляет вам терминалы бесплатно, требуется значительное количество дополнительных усилий для их создания, то есть раньше
csrss.exe
и сейчасconhost.exe
.Что касается разницы между ними, ваша ссылка «Вряд ли особенность» объясняет это вполне адекватно; короче говоря, он существует для обхода уязвимости в предыдущей итерации весьма секретного консольного API Windows, который допускал повышение привилегий в версиях NT, более старых, чем Windows 7. (Vista, к сведению, не имеет
conhost.exe
, что соответствует его статус Windows Миллениум семейства NT.)Любая программа, которая хочет эквивалент Unix stdin / stdout / stderr, нуждается в консоли, следовательно, экземпляр
conhost.exe
. Иммигранты из Unix-land, такие как Apache, PHP и др., Захотят получить эти потоки, поэтому система автоматически создастconhost.exe
для них экземпляр , независимо от того, отображают ли они окно или нет. Теоретически, было бы возможно изменить исходный код, например, для Apache, так, чтобы он не требовал терминала, и скомпилировать его как приложение с графическим интерфейсом Windows вместо консольного приложения, чтобы система не чувствовала необходимость его создания aconhost.exe
. Предполагая, что это также возможно на практике, похоже, никто не заботился об этом. Возможно, вы будете первым.Убийство данного
conhost.exe
факта почти наверняка отключит консольный ввод-вывод для любого процесса, запущенного под этим экземпляром. Возможно, вас это не волнует, потому что вы имеете дело с серверными процессами, которые в любом случае не делают ничего интересного в консольных потоках ввода-вывода, поэтому, вероятно, нет причин не убивать ихconhost.exe
. Если есть сомнения, убейте их и посмотрите, не сломается ли что-нибудь.Нет способа предотвратить создание экземпляра Windows
conhost.exe
при запуске программы, которая запрашивает консольный ввод-вывод; единственный способ сделать это - перекомпилировать его, чтобы Windows не считала его консольным приложением. Однако, предполагая, что уничтожение родительского процесса данного сервераconhost.exe
никоим образом не повлияет на его функциональность, вы должны иметь возможность убить их всех сразу, выполнивtaskkill /f /im conhost.exe
приглашение Run или окно консоли - предпочтительно первое, так как последний, вероятно, умрет и почти наверняка перестанет работать, как только его родительскийconhost.exe
экземпляр будет убит. Опять же, если сомневаетесь, убейте их и посмотрите, не сломается ли что-нибудь.источник
All that said, a portable server stack on a Flash drive sounds like it never spends much time running on any given machine
Я не знаю, что это значит. Вы говорите о циклах процессора? Если это так, то веб-сервер может быть довольно забит, если сайт достаточно популярен (и забит, даже если это не так; PHP на Windows не совсем дешевый ЦП). Если вы имеете в виду, как часто он запускается, я оставляю его включенным на моем ноутбуке всю неделю.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 году один мой друг сказал мне, что он работает на веб-сервере Linux на старой и минимальной - по стандартным на тот момент - системе). Поскольку он переносим, он должен быть максимально совместимым. И это не только память ; с одной стороны, он также загрязняет пространство процессов и загромождает диспетчер задач.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, не отчаивайтесь. Я недавно переиграл Jewels of the Oracle , запустив его в XP в VMPlayer, но когда я попытался играть в Jewels II , я не смог. Он не будет работать в XP или 2000. Он работает в 98, но 98 имеет плохую поддержку аудио-видео в VMPlayer и VirtualBox. После десятка попыток я обнаружил, что единственная комбинация ОС и ВМ, которая позволяет игре работать правильно, была ME в VMPlayer.conhost.exe
, так. А что касается Windows ME, мне пришлось постараться поддержать его, когда он был новым, и вы можете привести все неясные, запоздалые угловые случаи, которые вам нравятся, не нарушая моего мнения о том, что эта собака завтракала с ОС, которую я мог ругать весь день. без справедливости.Консольное приложение запущено с
DETACHED_PROCESS
флагом, не получает ни консольный, ни дочерний процесс conhost. Проблема в том, что флаг не применяется к внукам, поэтому он будет работать только с процессами, которые вы запускаете напрямую (если вы даже можете найти утилиту, которая позволяет вам указать этот флаг).Другой вариант, который может сработать, - это если консольный процесс вызывает
FreeConsole()
функцию. Некоторые серверные приложения поддерживают параметр -d или -detach, но это, вероятно, более распространено в системах * nix ...источник
conhost
, но связь кажется достаточно ясной. Я сделаю несколько тестов, чтобы увидеть, какие эффекты это имеет.Быстрое решение, которое может работать на вас. При связывании вашего приложения добавьте / SUBSYSTEM: WINDOWS к параметрам. Вы также можете использовать editbin.exe для изменения существующего исполняемого файла.
Это предотвращает появление Windows conhost.exe для вашего приложения.
источник
mysqld
, но когда я запустил это, он все еще порождалconhost
экземпляр.stderr
это все еще требуетсяmysqld
и, следовательно, необходимоconhost
?