Contexte
L'année dernière, j'ai compilé un système de blog / serveur Web portable que je peux exécuter à partir d'un lecteur flash. C'est génial et fonctionne à merveille, en particulier sur XP. Le problème est que lorsqu'il est exécuté dans Windows 7, chaque programme de console génère deux processus, le processus lui-même et une copie de conhost.exe
.
Problème
Dans le cas du système de blog portable, chacun de ses composants serveur (MySQL mysqld.exe
, les deux instances d' Apache, les deux instances de httpd.exe
VisualSVN visualsvnserver.exe
et les multiples instances de PHP php-cgi.exe
) génère une instance de conhost.exe
. En ce moment (sans copie d' php-cgi.exe
actif, j'ai cinq instances en conhost.exe
cours d' exécution, utilisant presque aucun cycle CPU, mais consommant 22 Mo de mémoire (en plus des 80 Mo que les processus réels utilisent actuellement).
Recherche
Depuis Windows 7 a été libéré (et je pense que peut - être depuis Vista), j'ai à plusieurs reprises essayé de comprendre exactement dans quel but les divers (nouveau) processus d'accueil (par exemple conhost.exe
, dllhost.exe
et taskhost.exe
) faire et si elles sont réellement nécessaires. J'ai essayé de les tuer et j'ai constaté que les programmes de console continuent de fonctionner, à la fois pour les programmes qui utilisent une fenêtre de console et ceux qui ne le font pas (comme les serveurs).
Je connais déjà l'ensemble csrss.exe
⇨ Windows Vista ⇨conhost.exe
et j'ai vu cette même explication (presque mot pour mot) à plusieurs reprises. Le problème est que tout le monde copie simplement cette même explication, ce qui n'est pas utile. Tout ce qu'il dit, c'est que dans XP-, les applications de console où «hébergé par» ou «exécuté sous» csrss.exe
, mais dans Windows 7, elles ont été déplacées vers conhost.exe
pour des raisons de sécurité. L'aspect sécurité est logique, mais il ne dit rien sur ce que signifie l'héberger ni pourquoi / quand c'est nécessaire (ou s'il est possible de l'éviter si ce n'est pas nécessaire). Même la discussion de Raymond Chen sur la question passe sous silence pourquoi les applications de console sont hébergées différemment.
La chose la plus proche que je peux trouver pour une explication technique détaillée est un article de blog Microsoft qui semble renforcer l'idée qu'il s'agit simplement de l'interface graphique et de la fenêtre de l'application console. Cela me laisse encore plus à me demander si cela conhost.exe
est nécessaire pour des programmes sans fenêtre comme ces serveurs. S'il n'y a aucune fenêtre, alors pourquoi devrais-je gaspiller des ressources et encombrer l'espace de processus avec des processus inutiles? Pourquoi Windows ne peut-il pas détecter les éléments inutiles et les éviter? La réponse de SecurityMatt a également été légèrement utile en ce qui concerne une explication technique, mais encore une fois, pas assez d'informations que je recherche.
Je ne suis pas le seul à avoir essayé de trouver un moyen d'arrêter les cas inutiles de conhost
. Cette personne a demandé de le désactiver et on lui a simplement répondu «ce n'est pas possible» sans autre effort ni réflexion. Hugh D et «Hardly a feature» ont souligné le problème avec de nombreuses instances redondantes de conhost
(au moins avec csrss
, il n'y avait qu'une seule copie en cours d'exécution), y compris l'utilisation des ressources et les instances persistantes après la fin de leurs processus enfants. J'ai demandé à Laufer si / quand c'était même nécessaire.
Observations et tentatives de solution
S'ils ne sont pas réellement nécessaires à tout moment (encore une fois, je n'ai vu aucun effet néfaste en les tuant), je suppose que je pourrais (très irritant) contourner le problème en remplaçant les serveurs par des fichiers de commandes qui exécutent les serveurs , attendez, puis supprimez la copie conhost
qu'ils provoquent. Bien sûr, cela nécessite un moyen rapide et facile de déterminer lequel il s'agit. FallenGameR a demandé comment obtenir l'instance de conhost.exe
associée à un programme de console d'un PID donné mais n'a pas obtenu de réponse. Je pense que la simple récupération du PID du processus parent devrait faire l'affaire (non, ProcessExplorer n'est pas une option, un automatisé / scriptableest nécessaire), mais non seulement cela nécessiterait de créer une sorte de cadre pour obtenir le PID de l'enfant (au lieu de simplement l'exécuter et de terminer la tâche), mais cela signifierait également trouver un moyen de le rendre compatible avec XP également (par exemple, vérifier le nom de l'image du processus parent). Ce billet de blog donne un sens, mais il nécessite PowerShell et n'est pas idéal, sans parler qu'il ne dit rien sur les ramifications de l'exécution du script.
Des questions)
Peut-être que Microsoft pense que personne n'utilise plus d'invites de commande (* cough * Windows 8 * cough *) et a donc supposé que ce n'était pas un gros problème de les surcharger, mais il existe certainement des scénarios où plusieurs applications de console s'exécutent et ont chacune générer un processus supplémentaire, consommant de la mémoire et utilisant PID est horrible, et essayer de le contourner est, au mieux, horriblement gênant.
Quelqu'un a-t-il des informations définitives et faisant autorité sur la question? Encore une fois, j'ai déjà lu l'explication générique; Je me demande:
- Pourquoi les applications de console doivent (encore) être gérées différemment
- Dans quelles circonstances spécifiques ils doivent avoir
conhost
- Quelles sont les conséquences de tuer
conhost
- S'il existe un moyen de l'arrêter / de l'empêcher / de le désactiver / de le bloquer ou au moins un moyen facile de le traiter rapidement vers l'arrière?
conhost.exe
c'était l'équivalent Windows d'un PTY, et cmd.exe
c'était le shell.
conshost.exe
apparaît-il encore?