(Wann) ist CONHOST.EXE tatsächlich notwendig?

12945
Synetech

Hintergrund

Letztes Jahr habe ich ein tragbares Blog- / Webserver-System erstellt, das ich von einem Flash-Laufwerk aus ausführen kann. Es ist großartig und funktioniert wunderbar, besonders unter XP. Das Problem ist, dass jedes Konsolenprogramm, wenn es unter Windows 7 ausgeführt wird, zwei Prozesse erzeugt, den Prozess selbst sowie eine Kopie von conhost.exe.

Problem

Im Fall des portablen Blogsystems erzeugt jede ihrer Serverkomponenten (MySQL mysqld.exe, zwei Instanzen von Apache, zwei Instanzen von httpd.exeVisualSVN visualsvnserver.exeund mehrere Instanzen von PHP php-cgi.exe) eine Instanz von conhost.exe. In diesem Moment (ohne php-cgi.exeaktive Kopien) habe ich fünf Instanzen des conhost.exeLaufens, verbrauchte fast keine CPU-Zyklen, verbrauchte jedoch 22 MB Speicher (zusätzlich zu den 80 MB, die die aktuellen Prozesse aktuell verwenden).

Forschung

Seit Windows 7 veröffentlicht wurde (und ich denke, möglicherweise seit Vista), habe ich mehrmals versucht herauszufinden , welchen Zweck die verschiedenen (neuen) Hostprozesse (z. B conhost.exe. dllhost.exe,, und taskhost.exe) haben und ob sie tatsächlich notwendig sind. Ich habe versucht, sie zu töten und stellte fest, dass die Konsolenprogramme weiterhin funktionieren, sowohl für Programme, die ein Konsolenfenster verwenden, als auch für solche, die dies nicht tun (wie Server).

Ich kenne das ganze csrss.exe⇨ Windows Vista ⇨ bereitsconhost.exe und habe dieselbe (fast wortwörtlich) Erklärung viele Male gesehen. Das Problem ist, dass jeder einfach dieselbe Erklärung kopiert, was nicht hilfreich ist. Es heißt lediglich, dass in XP-, Konsolenanwendungen „gehostet von“ oder „laufen lassen“ würden csrss.exe, in Windows 7 jedoch conhost.exeaus Sicherheitsgründen verschoben wurden . Der Sicherheitsaspekt ist zwar sinnvoll, sagt jedoch nichts darüber aus, was es heißt, es zu hosten oder warum / wann es notwendig ist (oder ob es möglich ist, dies zu vermeiden, wenn dies nicht notwendig ist). Sogar Raymond Chens Diskussion über die Angelegenheit besagt, warum Konsolen-Apps überhaupt unterschiedlich gehostet werden.

Einer detaillierten technischen Erklärung kann ich am besten einen Microsoft-Blogbeitrag entnehmen, der die Idee zu verstärken scheint, dass es sich lediglich um die GUI und das Fenster der Konsolen-App handelt. Ich frage mich daher noch mehr, ob conhost.exees für fensterlose Programme wie diese Server erforderlich ist. Wenn es überhaupt kein Fenster gibt, warum sollte ich dann Ressourcen verschwenden und den Prozessraum mit unnötigen Prozessen durcheinander bringen? Warum kann Windows nicht erkennen, wenn es unnötig ist, und es vermeiden? Die Antwort von SecurityMatt war auch im Hinblick auf eine technische Erklärung etwas hilfreich, aber auch hier nicht genügend Informationen, die ich suche.

Ich bin nicht der einzige, der versucht hat, einen Weg zu finden, um unnötige Instanzen zu stoppen conhost. Diese Person fragte nach der Deaktivierung und es wurde einfach gesagt: "Es ist nicht möglich", ohne weitere Anstrengungen oder Überlegungen. Hugh D und „Kaum ein Feature“ wiesen auf das Problem mit zahlreichen redundanten Instanzen von conhost(zumindest mit der csrssAusführung einer einzigen Kopie) hin, einschließlich der Ressourcennutzung und verbliebenen Instanzen, nachdem ihre untergeordneten Prozesse beendet waren. Ich fragte Laufer, ob und wann es überhaupt nötig ist.

Beobachtungen und Lösungsversuche

Wenn sie nicht zu jedem Zeitpunkt wirklich notwendig sind (wiederum habe ich keine negativen Auswirkungen davon gesehen), könnte ich das Problem (sehr irritierend) umgehen, indem ich die Server durch Batchdateien ersetzt, in denen die Server ausgeführt werden, warte und töte dann die Kopie davon conhost, die sie zum Laufen bringen. Dies erfordert natürlich eine schnelle und einfache Bestimmung, um welche es sich handelt. FallenGameR hat gefragt, wie Sie die Instanz conhost.exeeines Konsolenprogramms einer bestimmten PID erhalten, aber keine Antwort erhalten. Ich würde denken, dass das einfache Abrufen der PID des übergeordneten Prozesses den Trick ausführen sollte (nein, ProcessExplorer ist keine Option, eine automatisierte / scriptfähige Komponente)Lösung ist erforderlich), aber nicht nur das Erstellen eines Rahmens, um die PID des Kindes zu erhalten (anstatt es einfach auszuführen und mit der Aufgabe erledigt zu werden), es würde auch bedeuten, einen Weg zu finden, es kompatibel zu machen auch mit XP (z. B. Überprüfung des Image-Namens des übergeordneten Prozesses). Dieser Blogbeitrag gibt eine Möglichkeit, erfordert jedoch PowerShell und ist kaum ideal, ganz zu schweigen davon, dass er nichts über die Auswirkungen des Skripts sagt.

Fragen)

Microsoft geht vielleicht davon aus, dass niemand mehr Befehlsanweisungen verwendet (* hust * Windows 8 * hough *) und nahm daher an, dass es keine große Sache ist, sie zu belasten, aber es gibt durchaus Szenarien, in denen mehrere Konsolen-Apps laufen und jeweils eine haben ein zusätzlicher, speicherintensiver Prozess zur Verwendung von PIDs ist furchtbar und der Versuch, dies zu umgehen, ist im besten Fall furchtbar unbequem.

Hat jemand endgültige, maßgebliche Informationen zu dieser Angelegenheit? Wieder habe ich die generische Erklärung bereits gelesen; Ich frage mich:

  1. Warum müssen Konsolenanwendungen (noch) anders gehandhabt werden?
  2. Unter welchen Umständen müssen sie haben?conhost
  3. Welche Folgen hat das Töten ?conhost
  4. Wenn es eine Möglichkeit gibt, sie zu stoppen / zu verhindern / zu deaktivieren / zu blockieren, oder zumindest eine einfache Möglichkeit, sie schnell nachträglich zu behandeln?
23
Bevor sich jemand dagegen stört, um ihn zu verlinken (oder als Schlussvotum zu stimmen, habe ich hier bereits andere Fragen wie [hier] gesehen). Wie gesagt, das Ziehen und Ablegen einer Datei in eine fensterlose Konsolen-App ist irrelevant. Warum spawnt also `conshost.exe` noch? Synetech vor 10 Jahren 1
Nach dem, was ich gelesen habe, ist ein Teil des Problems, dass Windows Konsolen nicht wie * nix behandelt. Sie sind nicht einfach nur Zeichengeräte und als solche überhaupt nicht interoperabel (Es gibt eine sehr gute Diskussion unter der Anforderung von PuTTY, um die Verwendung von PuTTY als lokales Befehlsterminal zu unterstützen). Ich hatte immer gedacht, dass "conhost.exe" das Windows-Äquivalent eines PTY war und "cmd.exe" die Shell war. Darth Android vor 10 Jahren 1
Mögliches Duplikat von [Was ist der Prozess "conhost.exe", der im Task-Manager angezeigt wird?] (http://superuser.com/questions/27347/what-is-the-conhost-exe-process-that-shows- Up-in-Task-Manager) Ƭᴇcʜιᴇ007 vor 10 Jahren 0
@ techie007, das ist die Seite, auf die ich in [mein Kommentar oben] verlinkt habe (http://superuser.com/questions/624270/624304?noredirect=1#comment776680_624270). Synetech vor 10 Jahren 0

3 Antworten auf die Frage

18
Aaron Miller
  1. Konsolenanwendungen müssen unterschiedlich gehandhabt werden, da sie unter dem NT-Kernel (der allen 2000, XP, Vista, Windows 7 und Windows 8 zugrunde liegt) Bürger zweiter Klasse sind. In der Unix-Systemarchitektur sind jedem Prozess zum Zeitpunkt der Erstellung die standardmäßigen Eingabe-, Ausgabe- und Fehlerströme zugeordnet. Terminal-IO ist in Bezug auf diese Streams implementiert (stdin kommt von der Tastatur und stdout / stderr geht zum Terminal), und es ist ein zusätzlicher Aufwand seitens eines Prozesses erforderlich, der diese Streams nicht verwenden oder verwenden möchte ihre Dateideskriptoren öffnen sich.

    In der Windows-NT-Architektur, die zwar von VMS nicht etwa von demselben Team entwickelt wurde, ist das Gegenteil der Fall. Mit einem neu erstellten Prozess sind standardmäßig keine E / A-Streams verbunden, und es gibt kein Konzept wie ein "Terminal". Programme, die sich etwas mehr Unixy-Verhalten verhalten möchten, können (durch Kompilierzeitdeklaration) anfordern, dass das System für sie ein Konsolenfenster und damit verbundene Eingabe- / Ausgabeströme erstellt. Das System tut dies, aber da Windows Ihnen im Gegensatz zu Unix keine Terminals kostenlos zur Verfügung stellt, ist ein erheblicher zusätzlicher Aufwand erforderlich, um eines zu erstellen, also früher csrss.exeund jetzt conhost.exe.

    Was den Unterschied zwischen den beiden anbelangt, erklärt Ihre Verknüpfung "Kaum ein Merkmal" recht gut. kurz gesagt, es FYI um eine Sicherheitslücke in der vorherigen Iteration von Windows hoch recondite Konsole API, die für die Rechteerweiterung erlaubt in Versionen von NT älter als Windows 7. (Vista, arbeiten vorhanden ist, muss nicht conhost.exe, das seine geziemt von Status wie das Windows Millennium der NT-Familie.)

  2. Jedes Programm, das Unix stdin / stdout / stderr will, benötigt eine Konsole, also eine Instanz von conhost.exe. Zuwanderer aus Unix-Land wie Apache, PHP usw. werden diese Streams wünschen, daher die automatische Instantiierung des Systems conhost.exefür sie, ob sie tatsächlich ein Fenster anzeigen oder nicht. Theoretisch wäre es möglich, die Quelle für beispielsweise Apache so zu ändern, dass kein Endgerät erforderlich ist, und es als Windows-GUI-Anwendung anstelle einer Konsolenanwendung zu kompilieren, sodass das System nicht das Bedürfnis hat, es zu erzeugen conhost.exe. Vorausgesetzt, es ist auch in der Praxis möglich, scheint sich niemand dafür genug gekümmert zu haben. Vielleicht wirst du der Erste sein.

  3. Durch das Töten eines conhost.exebestimmten Befehls wird die Konsolen-E / A für alle Prozesse, die in dieser Instanz ausgeführt werden, mit großer Wahrscheinlichkeit deaktiviert. Sie interessieren sich wahrscheinlich nicht für das, weil Sie sich mit Serverprozessen beschäftigen, die ohnehin nichts Interessantes für die Konsolen-E / A-Streams tun conhost.exe. Wenn Sie Zweifel haben, töten Sie sie und sehen Sie, ob etwas kaputt geht.

  4. Es gibt keine Möglichkeit, zu verhindern, dass Windows beim Starten conhost.exeeines Programms instanziiert wird, das die Konsolen-E / A anfordert. Die einzige Möglichkeit, dies zu tun, wäre die Neukompilierung, damit Windows es nicht als Konsolenanwendung betrachtet. Wenn Sie jedoch davon ausgehen, dass das Eliminieren eines übergeordneten Serverprozesses conhost.exeseine Funktionalität in keiner Weise beeinträchtigt, sollten Sie in der Lage sein, sie alle auf einmal zu beenden, indem Sie sie taskkill /f /im conhost.exein einer Eingabeaufforderung ausführen oder in einem Konsolenfenster ausgeben Letzteres wird wahrscheinlich sterben und fast sicher nicht mehr funktionieren, sobald seine Mutterinstanz conhost.exegetötet wird. Im Zweifelsfall töten Sie sie wieder und sehen, ob etwas kaputt geht.

Ein tragbarer Server-Stack auf einem Flash-Laufwerk klingt jedoch so, als würde er nie lange auf einem bestimmten Rechner laufen, und 22 MB sind etwa 1% des RAM-Speichers des untersten Rechners, den man heutzutage problemlos kaufen kann. Ist es wirklich ein Problem, so viel Zeit und Mühe wert zu sein? Aaron Miller vor 10 Jahren 5
`All that said, a portable server stack on a Flash drive sounds like it never spends much time running on any given machine`   I don’t know what this means. Are you talking about CPU cycles? If so, then a web-server can get quite hammered if the site is popular enough (and hammered even if it’s not; PHP on Windows isn’t exactly CPU cheap). If you mean how often it is run in general, I leave it running on my laptop all week long. Synetech vor 10 Jahren 0
`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?`   You don’t run a personal web-server on a new machine, you run it on an old system that isn’t useful for much else. (In 1997 a friend told me he was running a Linux web-server on an old and minimal—by that time’s standard—system.) Since it’s portable, it has to be able to be as compatible as possible. And it’s *not just the memory*; for one thing, it also pollutes the process-space and clutters Task Manager. Synetech vor 10 Jahren 0
`Vista, FYI, does not have conhost.exe, which is befitting of its status as the Windows Millennium of the NT family.`   That’s why I put Vista between `csrss` to `conhost`; it was a middle step.   As for poor Windows ME, don’t bad-mouth it. I recently re-played *Jewels of the Oracle* by running it in XP in VMPlayer, but when I tried to play *Jewels II*, I couldn’t. It wouldn’t run in XP or 2000. It runs in 98, but 98 has poor audio-video support in VMPlayer and VirtualBox. After a dozen attempts, I found that the only combination of OS & VM that lets the game work correctly was ME in VMPlayer. Synetech vor 10 Jahren 0
Um es zu sagen: Wenn ich "tragbaren Server-Stack auf einem Flash-Laufwerk" höre, denke ich, "der Benutzer kann ihm keine Box widmen und muss sie leicht zwischen Maschinen verschieben können", weil es keinen anderen guten Grund gibt, dies auf diese Weise zu tun. Wenn Sie sich bereits mit VM-Overhead befassen, können Sie Ihren Webserver-Stack auf einer Linux-VM ausführen. Keine `conhost.exe` so. Und was Windows ME angeht, musste ich versuchen, es zu unterstützen, als es neu war, und Sie können alle dunklen und verspäteten Eckfälle zitieren, die Sie mögen, ohne meine Meinung über das Frühstück dieses Hundes eines Betriebssystems zu beeinträchtigen, das ich den ganzen Tag schlecht machen konnte ohne es gerecht zu werden. Aaron Miller vor 10 Jahren 4
@Synetech Die Antwort wurde aktualisiert, um weitere Informationen zu den Unterschieden zwischen den Unix- und Windows-E / A-Modellen zu enthalten, z. B. die Frage "Warum` conhost.exe '? " erhält jetzt eine inhaltliche Antwort anstelle eines abgeworfenen "Bürger zweiter Klasse"; Letzteres ist genau genug, aber es fehlt ihm an Detail. Aaron Miller vor 10 Jahren 0
Wenn ich "tragbaren Server-Stack auf einem Flash-Laufwerk" höre, denke ich, "der Benutzer kann ihm keine Box widmen und muss sie leicht zwischen den Maschinen verschieben können", da es keinen anderen guten Grund gibt, dies auf diese Weise zu tun wahr. Ich habe es überhaupt erst kreiert, weil ich nicht mehr nur ein einziges System verwendet habe, also musste ich es auf dem System haben, das ich gerade verwendete. Irgendwann werde ich es auf ein Raspberry Pi portieren, aber es immer noch tragbar halten. Ich betreibe den Server nicht in einer VM, sondern nur Juwelen 2 in ME. Danke für die technische Erklärung. Ich werde einige Tests durchführen, um herauszufinden, wann es sicher ist, es zu töten. Synetech vor 10 Jahren 0
@Synetech "... weil ich nicht mehr nur ein einziges System verwendet habe, also musste es auf dem System vorhanden sein, das ich zu dem Zeitpunkt" == "benutzte, dass es keine Box geben kann und es braucht leicht zwischen Maschinen zu bewegen ". Aaron Miller vor 10 Jahren 0
Der Benutzer kann ihm keine Box mehr widmen. (Zumindest bis ich ein Rπ bekomme.) Unabhängig davon hat das keinen Einfluss darauf, dass man fremde Prozesse vermeiden will. Selbst bei einem dedizierten System möchten Sie es schlank und optimal halten. Synetech vor 10 Jahren 0
Lasst uns [diese Diskussion im Chat fortsetzen] (http://chat.stackexchange.com/rooms/9835/discussion-between-aaron-miller-and-synetech) Aaron Miller vor 10 Jahren 0
@Synetech Die Diskussion wurde in den Chat verschoben, wenn Sie fortfahren möchten. Der automatisch generierte Kommentar über diesem Kommentar enthält den erforderlichen Link. Aaron Miller vor 10 Jahren 0
`Are you running on severely outdated hardware? You might do well to consider replacing it with something newer`   Gee, why didn’t I think of that? Send me a check for the new hardware and I will upgrade posthaste.    `Or are you simply obsessive on the subject? Finding something to obsess over that's at least productive of something more useful than a short process list in Task Manager.`    That’s exactly the attitude that has caused Windows to bloat and run dozens of unnecessary processes, and games to require super-computers and 50GB. Synetech vor 10 Jahren 0
@Synetech Ja, ich erinnere mich, wie es war, bevor ich einen Job bekam, für den ich mehr bezahlt werde, als was ich wert bin. Bleib dran, Kiddo! Irgendwann wird es besser, wenn nicht. Aaron Miller vor 10 Jahren 0
Ich war fassungslos. Mein Punkt war, dass man nicht alles lösen kann, indem man einfach Geld darauf wirft; Durch ein einfaches Upgrade werden nur die Symptome ausgeblendet, das Problem wird jedoch nicht behoben. Sicher können Sie * Rage * spielen, wenn Sie ein 3.000-Dollar-System mit einem i7-, HD-7000- und 2-TB-Laufwerk kaufen, aber das macht es nicht in Ordnung, dass es * braucht *, wenn es mit vielen tollen (noch besseren) Spielen fertig geworden ist * viel * weniger (ja, ich übertreibe zur Betonung… ein bisschen). Synetech vor 10 Jahren 0
@Synetech Ich denke, das hängt davon ab, was du mit "lösen" meinst. Wenn es darum geht, Geld oder Zeit auszugeben, bin ich meistens vollkommen glücklich, das Geld auszugeben, wenn ich es habe, und mein Leben weiterzuführen. Ich gebe zu, ich habe mich einmal anders gefühlt, aber Sie würden staunen, welche Auswirkungen es auf Ihre Perspektive haben kann, um fast ein Jahrzehnt mit Sysadmin-Arbeit zu verbringen - und die Tage, an denen ich solche Aufgaben interessant oder erfreulich fand, sind lang hinter mir, und es gab nie Tage, an denen ich Interesse hatte, über die Hardwareanforderungen von AAA-Spielen zu philosophieren. Aaron Miller vor 10 Jahren 0
Ich meine die traditionelle Definition. Wenn der Boden schmutzig ist, können Sie ihn „lösen“, indem Sie einen Teppich aufwerfen. Dies löst das Problem jedoch nicht. Es verdeckt nur das Symptom. Dies ist genau das, was Sie tun würden, indem Sie es ignorieren oder „bessere Hardware bekommen“ ”(Was für das Protokoll nicht eine gültige Lösung wäre, da dies eingebettete Systeme und dergleichen ausschließen würde - und ja, Sie können moderne Windows auf eingebetteten Systemen ausführen). Synetech vor 10 Jahren 0
@Synetech Sie meinen die * ideale * Definition. Es wäre sicher schön, in einer idealen Welt zu leben. Aaron Miller vor 10 Jahren 0
Nein, die * Standard * -Definition, die immer Wörter wie "richtig" oder "effektiv" enthält, aber niemals "gut genug". Ich hoffe nur, dass Sie nie eine Krankheit bekommen und einen Arzt haben, der wie Sie denkt. Sie würden dir einen Concealer geben und dich auf den Weg schicken. Synetech vor 10 Jahren 0
Äußerst spät zum Kommentarspiel, aber die gesamte Frage und Antwort war sehr informativ. Gibt es eine Möglichkeit, zu ermitteln, für welchen Prozess eine bestimmte Instanz von csrss / connhost ausgeführt wird? Nicholi vor 7 Jahren 0
@Nicholi Keine von denen ich weiß, Entschuldigung. Aaron Miller vor 7 Jahren 0
6
Anders

Eine Konsolenanwendung, die mit dem DETACHED_PROCESSFlag gestartet wird, erhält eine Konsole oder einen Conhost-Child-Prozess. Das Problem ist, dass das Flag nicht für Enkelkinder gilt. Es funktioniert also nur mit den Prozessen, die Sie direkt starten (wenn Sie sogar ein Dienstprogramm finden, mit dem Sie dieses Flag angeben können).

Die andere Option, die möglicherweise funktioniert, ist, wenn der Konsolenprozess die FreeConsole()Funktion aufruft . Einige Serveranwendungen unterstützen einen -d- oder -detach -Parameter. Dies ist jedoch wahrscheinlich auf * nix-Systemen üblicher ...

Das hört sich genial an. Keine dieser Seiten erwähnt "conhost", aber die Verbindung scheint ziemlich klar zu sein. Ich werde einige Tests machen, um zu sehen, welche Auswirkungen es hat. Synetech vor 10 Jahren 0
1
HarryTheDev

Schnelle Lösung, die für Sie arbeiten kann. Wenn Sie Ihre Anwendung verknüpfen, fügen Sie den Optionen / SUBSYSTEM: WINDOWS hinzu. Sie können auch editbin.exe verwenden, um eine vorhandene ausführbare Datei zu ändern.

Dadurch wird verhindert, dass Windows eine conhost.exe für Ihre Anwendung erzeugt.

Das klang vielversprechend, aber ich habe es gerade ausprobiert und es hat nicht funktioniert. Ich habe es benutzt, um das Subsystem für `mysqld` zu ändern, aber als ich das ausgeführt habe, wurde immer noch eine` conhost`-Instanz erzeugt. Synetech vor 10 Jahren 0
Könnte es sein, dass "stderr" für "mysqld" noch benötigt wird und somit "conhost" benötigt wird? David T. Macknet vor 8 Jahren 0