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.exe
und jetztconhost.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.)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 Systemsconhost.exe
fü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 erzeugenconhost.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.Durch das Töten eines
conhost.exe
bestimmten 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 tunconhost.exe
. Wenn Sie Zweifel haben, töten Sie sie und sehen Sie, ob etwas kaputt geht.Es gibt keine Möglichkeit, zu verhindern, dass Windows beim Starten
conhost.exe
eines 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 Serverprozessesconhost.exe
seine Funktionalität in keiner Weise beeinträchtigt, sollten Sie in der Lage sein, sie alle auf einmal zu beenden, indem Sie sietaskkill /f /im conhost.exe
in einer Eingabeaufforderung ausführen oder in einem Konsolenfenster ausgeben Letzteres wird wahrscheinlich sterben und fast sicher nicht mehr funktionieren, sobald seine Mutterinstanzconhost.exe
getötet wird. Im Zweifelsfall töten Sie sie wieder und sehen, ob etwas kaputt geht.
(Wann) ist CONHOST.EXE tatsächlich notwendig?
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.exe
VisualSVN visualsvnserver.exe
und mehrere Instanzen von PHP php-cgi.exe
) eine Instanz von conhost.exe
. In diesem Moment (ohne php-cgi.exe
aktive Kopien) habe ich fünf Instanzen des conhost.exe
Laufens, 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.exe
aus 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.exe
es 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 csrss
Ausfü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.exe
eines 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:
- Warum müssen Konsolenanwendungen (noch) anders gehandhabt werden?
- Unter welchen Umständen müssen sie haben?
conhost
- Welche Folgen hat das Töten ?
conhost
- 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?
3 Antworten auf die Frage
Eine Konsolenanwendung, die mit dem DETACHED_PROCESS
Flag 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 ...
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.
Verwandte Probleme
-
2
Erinnert sich Windows 7 Home Premium an Netzwerkfreigaben-Passwörter?
-
4
Wie sperre ich rechtsbündige Symbolleisten in Windows 7, ohne dass sie schrecklich aussehen
-
4
Windows 7 "Aero Snap" -Funktion für Ubuntu GNOME
-
3
Meine zweite Festplatte ist in Windows 7 nicht sichtbar
-
7
Wie ersetze ich Notepad in Windows 7?
-
2
Wie werden Windows 7-Taskleistensymbole in zwei Reihen angeordnet?
-
1
Probleme beim Standby unter Windows 7
-
6
Wie steuern Sie die Windows 7-Snap-Funktion mit zwei Monitoren?
-
10
Wie aktualisiere ich von Windows 7 RC auf Windows 7 RTM?
-
3
Welchen Spyware-Schutz gibt es für Windows 7?