fundo
No ano passado, compilei um sistema portátil de blog / servidor da web que posso executar a partir de uma unidade flash. É ótimo e funciona maravilhosamente, especialmente no XP. O problema é que, quando executado no Windows 7, cada programa de console gera dois processos, o próprio processo, além de uma cópia do conhost.exe
.
Problema
No caso do sistema de blog portátil, cada um de seus componentes de servidor (MySQL mysqld.exe
, duas instâncias do Apache, duas instâncias do httpd.exe
VisualSVN visualsvnserver.exe
e várias instâncias do PHP php-cgi.exe
) gera uma instância de conhost.exe
. Neste momento (sem cópias de php-cgi.exe
ativo, tenho cinco instâncias de conhost.exe
execução, usando quase nenhum ciclo de CPU, mas consumindo 22 MB de memória (além dos 80 MB que os processos atuais estão usando atualmente)).
Pesquisa
Como o Windows 7 foi lançado (e eu acho que possivelmente desde Vista), eu tenho em várias ocasiões tentou descobrir exatamente qual o propósito dos vários processos (novo) hospedeiro (por exemplo, conhost.exe
, dllhost.exe
e taskhost.exe
) fazer e se eles são realmente necessários. Tentei matá-los e descobri que os programas do console continuam funcionando, tanto para programas que usam uma janela do console quanto para aqueles que não usam (como servidores).
Eu já estou familiarizado com todo o csrss.exe
Windows Vistaconhost.exe
e já vi essa mesma explicação (quase literalmente) várias vezes. O problema é que todo mundo simplesmente copia e cola a mesma explicação que não ajuda. Tudo o que diz é que, no XP, aplicativos de console onde "hospedados por" ou "executados em" csrss.exe
, mas no Windows 7, eles foram movidos conhost.exe
para segurança. O aspecto da segurança faz sentido, mas não diz nada sobre o que significa hospedá-lo ou por que / quando é necessário (ou se é possível evitá-lo se não for necessário). Até a discussão de Raymond Chen encobre o motivo pelo qual os aplicativos de console são hospedados de maneira diferente.
A coisa mais próxima que posso encontrar de uma explicação técnica detalhada é uma publicação no blog da Microsoft que parece reforçar a ideia de que é apenas sobre a GUI e a janela do aplicativo do console. Isso me deixa pensando ainda mais se conhost.exe
é necessário para programas sem janelas como esses servidores. Se não há nenhuma janela, por que devo desperdiçar recursos e encher o espaço de processos com processos desnecessários? Por que o Windows não pode detectar quando é desnecessário e evitá-lo? A resposta do SecurityMatt também foi um pouco útil no que diz respeito a uma explicação técnica, mas, novamente, não são suficientes as informações que estou procurando.
Eu não sou o único que tentou descobrir uma maneira de parar instâncias desnecessárias de conhost
. Essa pessoa perguntou sobre desativá-lo e foi-lhe dito simplesmente "não é possível" sem nenhum esforço ou pensamento adicional. Hugh D e "Dificilmente um recurso" apontaram o problema com várias instâncias redundantes de conhost
(pelo menos com csrss
apenas uma cópia em execução), incluindo o uso de recursos e as instâncias remanescentes após o término dos processos filhos. Laufer questionou se / quando é necessário.
Observações e tentativas de solução
Se eles não forem realmente necessários o tempo todo (novamente, eu não vi nenhum efeito prejudicial ao matá-los), então suponho que eu poderia (muito irritante) contornar o problema substituindo os servidores por arquivos em lote que os executam. , aguarde e, em seguida, mate a cópia do conhost
que eles causam a execução. Obviamente, isso requer uma maneira rápida e fácil de determinar qual é. FallenGameR perguntou como obter a instância de conhost.exe
associado a um programa de console de um determinado PID, mas não obteve resposta. Eu acho que a simples recuperação do PID do processo pai deve funcionar (não, o ProcessExplorer não é uma opção, um sistema automatizado / com script)é necessária), mas isso não apenas exigiria a criação de algum tipo de estrutura para obter o PID do filho (em vez de simplesmente executá-lo e concluir a tarefa), mas também significaria descobrir uma maneira de torná-lo compatível com o XP também (por exemplo, verificando o nome da imagem do processo pai). Esta postagem do blog mostra uma maneira, mas requer o PowerShell e dificilmente é ideal, sem mencionar que não diz nada sobre as implicações da execução do script.
Questões)
Talvez a Microsoft pense que ninguém mais usa prompt de comando (* tosse * Windows 8 * tosse *) e suponha que não seja muito difícil sobrecarregá-los, mas há definitivamente cenários em que vários aplicativos de console estão em execução e possuem todos e cada um gerar um processo extra, que consome memória e usa PID é horrível, e tentar contorná-lo é, na melhor das hipóteses, terrivelmente inconveniente.
Alguém tem informações definitivas e autorizadas sobre o assunto? Novamente, eu já li a explicação genérica; Estou pensando:
- Por que os aplicativos de console (ainda) devem ser tratados de maneira diferente
- Em que circunstâncias específicas eles precisam ter
conhost
- Quais são as consequências de matar
conhost
- Se existe alguma maneira de parar / impedir / desativar / bloquear ou pelo menos uma maneira fácil de lidar rapidamente com isso posteriormente?
conhost.exe
era o equivalente do Windows a um PTY e cmd.exe
era a concha.
conshost.exe
ainda está gerando?