Fondo
El año pasado compilé un sistema portátil de blog / servidor web que puedo ejecutar desde una unidad flash. Es genial y funciona de maravilla, especialmente en XP. El problema es que cuando se ejecuta en Windows 7, cada programa de consola genera dos procesos, el proceso en sí mismo, más una copia de conhost.exe
.
Problema
En el caso del sistema de blog portátil, cada uno de sus componentes de servidor (MySQL mysqld.exe
, dos instancias de Apache, dos instancias de httpd.exe
VisualSVN visualsvnserver.exe
y múltiples instancias de PHP php-cgi.exe
) genera una instancia de conhost.exe
. En este momento (sin copias de php-cgi.exe
activo, tengo cinco instancias de conhost.exe
ejecución, usando casi ningún ciclo de CPU, pero consumiendo 22 MB de memoria (además de los 80 MB que los procesos reales están usando actualmente).
Investigación
Desde que se lanzó Windows 7 (y creo que posiblemente desde Vista), tengo en varias ocasiones trató de averiguar exactamente qué propósito los diferentes procesos (nuevo) huésped (por ejemplo, conhost.exe
, dllhost.exe
, y taskhost.exe
) hacer y si son realmente necesarias. Intenté matarlos y descubrí que los programas de consola continúan funcionando, tanto para los programas que usan una ventana de consola como para los que no (como los servidores).
Ya estoy familiarizado con todo el csrss.exe
⇨ Windows Vista ⇨conhost.exe
y he visto esa misma explicación (casi textualmente) en numerosas ocasiones. El problema es que todos simplemente copian y pegan la misma explicación que no es útil. Todo lo que dice es que en XP-, las aplicaciones de consola csrss.exe
estaban "alojadas por" o "se ejecutaban bajo" , pero en Windows 7, se trasladaron a ellas conhost.exe
por seguridad. El aspecto de seguridad tiene sentido, pero no dice nada sobre lo que significa alojarlo o por qué / cuándo es necesario (o si es posible evitarlo si no es necesario). Incluso la discusión de Raymond Chen sobre el tema pasa por alto por qué las aplicaciones de consola están alojadas de manera diferente.
Lo más parecido que puedo encontrar a una explicación técnica detallada es una publicación de blog de Microsoft que parece reforzar la idea de que se trata simplemente de la ventana y la GUI de la aplicación de consola. Esto me hace preguntarme aún más si conhost.exe
es necesario para programas sin ventanas como estos servidores. Si no hay ninguna ventana, ¿por qué debería tener que desperdiciar recursos y desordenar el espacio de procesos con procesos innecesarios? ¿Por qué Windows no puede detectar cuando es innecesario y evitarlo? La respuesta de SecurityMatt también fue un poco útil en lo que respecta a una explicación técnica, pero nuevamente, no es suficiente la información que estoy buscando.
No soy el único que ha tratado de encontrar una manera de detener instancias innecesarias conhost
. Esta persona preguntó acerca de deshabilitarlo y se le dijo simplemente "no es posible" sin más esfuerzo o pensamiento al respecto. Hugh D y "Hardly a feature" señalaron el problema con numerosas instancias redundantes de conhost
(al menos csrss
, solo se estaba ejecutando una copia), incluido el uso de recursos y las instancias persistentes después de que sus procesos secundarios hayan finalizado. Laufer cuestionó si / cuándo es necesario.
Observaciones e intentos de solución
Si no son realmente necesarios en todo momento (una vez más, no he visto ningún efecto negativo por matarlos), entonces supongo que podría (muy irritantemente) solucionar el problema reemplazando los servidores con archivos por lotes que los ejecutan. , espere y luego elimine la copia conhost
que causan que se ejecute. Por supuesto, esto requiere una forma rápida y fácil de determinar cuál es. FallenGameR preguntó cómo obtener la instancia de conhost.exe
asociado con un programa de consola de un PID determinado, pero no obtuvo una respuesta. Creo que simplemente recuperar el PID del proceso principal debería ser el truco (no, ProcessExplorer no es una opción, un automatizado / programablese requiere una solución), pero eso no solo requeriría crear algún tipo de marco para obtener el PID del niño (en lugar de simplemente ejecutarlo y terminar con la tarea), sino que también significaría encontrar una manera de hacerlo compatible con XP también (por ejemplo, verificando el nombre de la imagen del proceso padre). Esta publicación de blog ofrece una forma, pero requiere PowerShell y no es ideal, sin mencionar que no dice nada sobre las ramificaciones de ejecutar el script.
Pregunta (s)
Quizás Microsoft se da cuenta de que ya nadie usa las instrucciones de comando (* tos * Windows 8 * tos *) y, por lo tanto, asumió que no es un gran problema cargarlos, pero definitivamente hay escenarios en los que se ejecutan varias aplicaciones de consola y tienen todas y cada una generar un proceso adicional, que consume memoria y usa PID es horrible, y tratar de solucionarlo es, en el mejor de los casos, terriblemente inconveniente.
¿Alguien tiene información definitiva y autorizada sobre el asunto? Nuevamente, ya leí la explicación genérica; Me pregunto:
- ¿Por qué las aplicaciones de consola deben (todavía) manejarse de manera diferente?
- Bajo qué circunstancias específicas necesitan tener
conhost
- Cuáles son las consecuencias de matar
conhost
- ¿Si hay alguna forma de detenerlo / prevenirlo / deshabilitarlo / bloquearlo o al menos una manera fácil de tratarlo rápidamente después?
conhost.exe
era el equivalente de Windows de un PTY, y que cmd.exe
era el shell.
conshost.exe
sigue apareciendo?