(Quand) CONHOST.EXE est-il réellement nécessaire?


23

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.exeVisualSVN visualsvnserver.exeet les multiples instances de PHP php-cgi.exe) génère une instance de conhost.exe. En ce moment (sans copie d' php-cgi.exeactif, j'ai cinq instances en conhost.execours 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.exeet 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.exepour 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.exeest 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 conhostqu'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.exeassocié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:

  1. Pourquoi les applications de console doivent (encore) être gérées différemment
  2. Dans quelles circonstances spécifiques ils doivent avoirconhost
  3. Quelles sont les conséquences de tuerconhost
  4. 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?

1
Avant que quiconque ne prenne la peine de créer un lien vers celui-ci (ou de voter pour le fermer en double, j'ai déjà vu d'autres questions comme [celle-ci]). Comme je l'ai dit, le glisser-déposer d'un fichier vers une application de console sans fenêtre n'est pas pertinent, alors pourquoi conshost.exeapparaît-il encore?
Synetech

1
D'après ce que j'ai lu, une partie du problème est que Windows ne gère pas les consoles comme * nix. Ce ne sont pas simplement des dispositifs de caractères, et ne sont pas du tout interopérables en tant que tels (il y a une très bonne discussion à ce sujet sous la demande de fonctionnalité PuTTY pour prendre en charge l'utilisation de PuTTY comme terminal de commande local). J'avais toujours pensé que conhost.exec'était l'équivalent Windows d'un PTY, et cmd.exec'était le shell.
Dark Android


@ techie007, c'est la page à laquelle j'ai (essayé de) créer un lien dans mon commentaire ci-dessus .
Synetech

Réponses:


19
  1. Les applications de console doivent être traitées différemment car sous le noyau NT (qui sous-tend tous 2000, XP, Vista, Windows 7 et Windows 8), ce sont des citoyens de seconde classe. Dans l'architecture système Unix, chaque processus au moment de la création est associé aux flux d'entrée, de sortie et d'erreur standard; le terminal IO est implémenté en termes de ces flux (stdin provenant du clavier et stdout / stderr allant vers le terminal), et un effort supplémentaire est requis de la part d'un processus qui ne souhaite pas utiliser ces flux ou leurs descripteurs de fichiers s'ouvrent.

    Dans l'architecture Windows NT, qui bien que n'étant pas un descendant linéaire de VMS a été développé par plus ou moins la même équipe, l'inverse est vrai; un processus nouvellement engendré par défaut n'a aucun flux d'E / S connecté à lui, et il n'y a pas un tel concept comme un "terminal". Les programmes qui souhaitent se comporter de façon un peu plus Unixy peuvent demander (par déclaration au moment de la compilation) que le système crée pour eux une fenêtre de console et des flux d'entrée / sortie qui lui sont connectés; le système le fera, mais comme Windows, contrairement à Unix, ne vous offre pas de terminaux gratuitement, un effort considérable est nécessaire pour en créer un, donc autrefois csrss.exe, et maintenant conhost.exe.

    Quant à la différence entre les deux, votre lien "A peine une fonctionnalité" l'explique assez bien; en bref, il existe pour contourner une faille de sécurité dans l'itération précédente de l'API de console hautement recondite de Windows, qui permettait une escalade de privilèges dans les versions de NT plus anciennes que Windows 7. (Vista, FYI, n'en a pas conhost.exe, ce qui convient à son en tant que Windows Millennium de la famille NT.)

  2. Tout programme qui veut l'équivalent d'Unix stdin / stdout / stderr a besoin d'une console, donc d'une instance de conhost.exe. Les immigrants de pays Unix, tels qu'Apache, PHP, et autres, vont vouloir ces flux, d'où l'instanciation automatique du système conhost.exepour eux, qu'ils affichent réellement une fenêtre ou non. En théorie, il serait possible de modifier la source pour Apache par exemple de telle sorte qu'il ne nécessite aucun terminal, et de le compiler comme une application Windows GUI au lieu d'une application console, de sorte que le système ne ressentira pas le besoin de le générer conhost.exe. En supposant que c'est également possible dans la pratique, personne ne semble s'en être suffisamment soucié. Vous serez peut-être le premier.

  3. Tuer une donnée conhost.exedésactivera presque certainement les E / S de la console pour tout processus exécuté sous cette instance. Vous ne vous en souciez probablement pas, car vous avez affaire à des processus serveur qui ne font rien d'intéressant sur les flux d'E / S de la console de toute façon, il n'y a donc probablement aucune raison de ne pas tuer leurs conhost.exes. En cas de doute, tuez-les et voyez si cela casse quoi que ce soit.

  4. Il n’existe aucun moyen d’empêcher Windows de s’instancier conhost.exelorsqu’un programme lancé qui demande des entrées / sorties de console; la seule façon de le faire serait de le recompiler afin que Windows ne le considère pas comme une application console. Cependant, en supposant que la suppression du parent d'un processus serveur donné conhost.exen'affecte pas ses fonctionnalités de quelque manière que ce soit, vous devriez être en mesure de les tuer tous en même temps en émettant taskkill /f /im conhost.exeune invite d'exécution ou une fenêtre de console - de préférence la première, car ce dernier mourra probablement, et cessera presque certainement de fonctionner, dès que son conhost.exeinstance mère sera tuée. Encore une fois, en cas de doute, tuez-les et voyez si cela casse quoi que ce soit.


5
Cela dit, une pile de serveurs portables sur un lecteur Flash semble ne jamais passer beaucoup de temps sur une machine donnée, et 22 Mo représentent environ 1% du complément RAM de la machine la plus basse que vous pouvez même facilement acheter de nos jours. Est-ce vraiment un problème suffisant pour valoir autant de temps et d'efforts?
Aaron Miller

All that said, a portable server stack on a Flash drive sounds like it never spends much time running on any given machine Je ne sais pas ce que ça veut dire. Parlez-vous de cycles CPU? Si c'est le cas, alors un serveur Web peut être assez martelé si le site est assez populaire (et martelé même si ce n'est pas le cas; PHP sur Windows n'est pas exactement bon marché pour le CPU). Si vous voulez dire combien de fois il est exécuté en général, je le laisse fonctionner sur mon ordinateur portable toute la semaine.
Synetech

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? Vous n'exécutez pas de serveur Web personnel sur une nouvelle machine, vous l'exécutez sur un ancien système qui n'est pas utile pour beaucoup d'autre. (En 1997, un ami m'a dit qu'il exécutait un serveur Web Linux sur un système ancien et minimal - à l'époque standard -). Comme il est portable, il doit pouvoir être aussi compatible que possible. Et ce n'est pas seulement la mémoire ; d'une part, il pollue également l'espace de processus et encombre le Gestionnaire des tâches.
Synetech

Vista, FYI, does not have conhost.exe, which is befitting of its status as the Windows Millennium of the NT family. Voilà pourquoi je mets entre Vista csrssà conhost; c'était une étape intermédiaire. Quant au pauvre Windows ME, ne le croyez pas. J'ai récemment rejoué Jewels of the Oracle en l'exécutant sous XP dans VMPlayer, mais quand j'ai essayé de jouer à Jewels II , je n'ai pas pu. Il ne fonctionnerait pas sous XP ou 2000. Il fonctionne sous 98, mais 98 a un support audio-vidéo médiocre dans VMPlayer et VirtualBox. Après une douzaine de tentatives, j'ai trouvé que la seule combinaison d'OS et de VM qui permettait au jeu de fonctionner correctement était ME dans VMPlayer.
Synetech

4
Dans l'ordre: lorsque j'entends "pile de serveur portable sur un lecteur Flash", je pense que "l'utilisateur ne peut pas lui dédier une boîte et qu'il a besoin de la déplacer facilement entre les machines", car il n'y a aucune autre bonne raison de le faire de cette façon. Si vous êtes déjà confronté à une surcharge de machine virtuelle, pourquoi ne pas simplement exécuter votre pile de serveurs Web sur une machine virtuelle Linux? Pas comme conhost.exeça. Et en ce qui concerne Windows ME, j'ai dû essayer de le soutenir quand il était nouveau, et vous pouvez citer tous les cas de coin obscurs et tardifs que vous aimez sans bouger de mon avis sur le petit-déjeuner de ce chien avec un OS, que je pourrais salir toute la journée sans lui rendre justice.
Aaron Miller

7

Une application console démarrée avec l' DETACHED_PROCESSindicateur obtient une console ni un processus enfant conhost. Le problème est que l'indicateur ne s'applique pas aux petits-enfants, il ne fonctionnera donc qu'avec les processus que vous démarrez directement (si vous pouvez même trouver un utilitaire qui vous permet de spécifier cet indicateur).

L'autre option qui pourrait fonctionner est si le processus de la console appelle la FreeConsole()fonction. Certaines applications serveur prennent en charge un paramètre -d ou -detach mais cela est probablement plus courant sur les systèmes * nix ...


1
Cela semble génial. Aucune de ces pages ne mentionne conhost, mais la connexion semble assez claire. Je ferai quelques tests pour voir quel genre d'effets cela a.
Synetech

2

Solution rapide qui peut fonctionner pour vous. Lorsque vous liez votre application, ajoutez / SUBSYSTEM: WINDOWS aux options. Vous pouvez également utiliser editbin.exe pour modifier un exécutable existant.

Cela empêche Windows de générer un conhost.exe pour votre application.


Cela semblait prometteur, mais je l'ai juste essayé et cela n'a pas fonctionné. Je l'ai utilisé pour changer le sous-système mysqld, mais quand je l'ai exécuté, il a toujours généré une conhostinstance.
Synetech

Serait-ce stderrencore nécessaire mysqldet donc nécessaire conhost?
David T.Macknet
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.