Hintergrund
Letztes Jahr habe ich ein tragbares Blog / Web-Server-System kompiliert, das ich von einem Flash-Laufwerk ausführen kann. Es ist großartig und funktioniert wunderbar, besonders unter XP. Das Problem ist, dass unter Windows 7 jedes Konsolenprogramm zwei Prozesse erzeugt, den Prozess selbst und eine Kopie von conhost.exe
.
Problem
Im Fall des tragbaren Blog - Systems, die jeweils einer seiner Server - Komponenten (MySQL mysqld.exe
, Apache zwei Instanzen httpd.exe
, VisualSVN die zwei Instanzen visualsvnserver.exe
, und mehrere Instanzen von PHP php-cgi.exe
) laicht eine Instanz conhost.exe
. In diesem Moment (ohne Kopien von php-cgi.exe
active, habe ich fünf conhost.exe
laufende Instanzen , die fast keine CPU-Zyklen belegen, aber 22 MB Arbeitsspeicher verbrauchen (zusätzlich zu den 80 MB, die die tatsächlichen Prozesse derzeit verwenden).
Forschung
Da Windows 7 veröffentlicht wurde (und ich denke , vielleicht seit Vista), habe ich mehrmals auf versuchte herauszufinden , genau , welchen Zweck die verschiedenen (neu) Host - Prozesse (zB conhost.exe
, dllhost.exe
und taskhost.exe
) zu tun und ob sie tatsächlich notwendig sind. Ich habe versucht, sie zu töten und festgestellt, 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 mich bereits mit csrss.exe
Windows Vista ausconhost.exe
und habe die gleiche (fast wörtliche) Erklärung mehrmals gesehen. Das Problem ist, dass jeder einfach die gleiche Erklärung kopiert, was nicht hilfreich ist. Es heißt nur, dass in XP-, Konsolenanwendungen, bei denen "Hosted by" oder "Run under" csrss.exe
war, diese conhost.exe
aus Sicherheitsgründen in Windows 7 verschoben wurden . Der Sicherheitsaspekt ist sinnvoll, sagt aber nichts darüber aus, was es bedeutet, ihn zu hosten oder warum / wann es notwendig ist (oder ob es möglich ist, ihn zu vermeiden, wenn es nicht notwendig ist). Sogar Raymond Chens Diskussion zu diesem Thema beschönigt, warum Konsolen-Apps überhaupt anders gehostet werden.
Das Nächste, was ich zu einer detaillierten, technischen Erklärung finden kann, ist ein Microsoft-Blogbeitrag, der die Idee zu untermauern scheint, dass es sich lediglich um die GUI und das Fenster der Konsolen-App handelt. Deshalb frage ich mich immer mehr, ob conhost.exe
dies 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 überladen müssen? Warum kann Windows nicht erkennen, wenn es unnötig ist, und es vermeiden? Die Antwort von SecurityMatt war auch in Bezug auf eine technische Erklärung ein wenig nützlich, aber auch hier reichte die gesuchte Information nicht aus.
Ich bin nicht der einzige, der versucht hat, unnötige Vorkommnisse zu stoppen conhost
. Diese Person fragte nach der Deaktivierung und erhielt einfach den Hinweis, dass dies ohne weitere Anstrengungen oder Gedanken nicht möglich sei. Hugh D und „Kaum ein Feature“ wiesen auf das Problem mit zahlreichen redundanten Instanzen von conhost
(zumindest mit csrss
nur einer ausgeführten Kopie) hin, einschließlich der Ressourcennutzung und verweilender Instanzen nach dem Ende ihrer untergeordneten Prozesse. Ich habe Laufer gefragt, ob / wann es überhaupt nötig ist.
Beobachtungen und Lösungsansätze
Wenn sie nicht zu allen Zeiten tatsächlich erforderlich sind (wieder habe ich keine negativen Auswirkungen ihrer Beseitigung gesehen), könnte ich das Problem (sehr irritierend) umgehen, indem ich die Server durch Batchdateien ersetze, auf denen die Server ausgeführt werden Warten Sie, und töten Sie dann die Kopie conhost
, die sie ausführen. Dies erfordert natürlich eine schnelle und einfache Methode, um festzustellen, um welche es sich handelt. FallenGameR hat gefragt, wie die conhost.exe
mit einem Konsolenprogramm einer bestimmten PID verknüpfte Instanz abgerufen werden soll , hat jedoch keine Antwort erhalten. Ich würde denken, dass das einfache Abrufen der PID des übergeordneten Prozesses den Trick tun sollte (nein, ProcessExplorer ist keine Option, eine automatisierte / skriptfähigeLösung ist erforderlich), aber dies würde nicht nur das Erstellen eines Frameworks zum Abrufen der PID des Kindes erfordern (anstatt es einfach auszuführen und mit der Aufgabe fertig zu sein), sondern auch das Herausfinden einer Möglichkeit, es kompatibel zu machen auch mit XP (z. B. Überprüfen des Abbildnamens des übergeordneten Prozesses). Dieser Blog- Beitrag gibt einen Weg vor, erfordert jedoch PowerShell und ist kaum ideal, ganz zu schweigen von den Auswirkungen der Ausführung des Skripts.
Fragen)
Möglicherweise geht Microsoft davon aus, dass niemand mehr Eingabeaufforderungen verwendet (* hust * Windows 8 * hust *) und vermutet, dass dies keine große Belastung darstellt, aber es gibt definitiv Szenarien, in denen mehrere Konsolen-Apps ausgeführt werden und jede einzelne haben Es ist schrecklich, einen zusätzlichen, speicherintensiven PID-Prozess zu erzeugen, und es ist bestenfalls schrecklich unpraktisch, ihn zu umgehen.
Hat jemand endgültige, maßgebliche Informationen zu diesem Thema? Wieder habe ich bereits die allgemeine Erklärung gelesen; Ich frage mich:
- Warum Konsolenanwendungen (noch) anders behandelt werden müssen
- Unter welchen besonderen Umständen müssen sie haben
conhost
- Welche Konsequenzen hat das Töten ?
conhost
- Gibt es eine Möglichkeit, es zu stoppen / zu verhindern / zu deaktivieren / zu blockieren oder zumindest eine einfache Möglichkeit, es später schnell zu lösen?
conhost.exe
das Windows-Äquivalent eines PTY ist und cmd.exe
die Shell.
conshost.exe
noch?