tło
W zeszłym roku skompilowałem przenośny system blog / serwer WWW, który mogę uruchomić z dysku flash. Jest świetny i działa wspaniale, szczególnie na XP. Problem polega na tym, że gdy jest uruchamiany w systemie Windows 7, każdy program konsoli odradza dwa procesy, sam proces plus kopię conhost.exe
.
Problem
W przypadku przenośnego systemu blogów, każdy z jego składników serwera (MySQL mysqld.exe
, dwa wystąpienia Apache, dwa wystąpienia httpd.exe
VisualSVN visualsvnserver.exe
i wiele wystąpień PHP php-cgi.exe
) spawnuje wystąpienie conhost.exe
. W tej chwili (bez kopii php-cgi.exe
aktywnych, mam pięć instancji conhost.exe
uruchomionych, zużywających prawie żadnych cykli procesora, ale zużywających 22 MB pamięci (oprócz 80 MB, których aktualnie używają rzeczywiste procesy).
Badania
Ponieważ system Windows 7 został wydany (i myślę, że być może od Vista), mam kilkakrotnie próbowali dowiedzieć się dokładnie, jaki cel różne procesy (nowy) hosta (na przykład conhost.exe
, dllhost.exe
i taskhost.exe
) robić i czy są one rzeczywiście niezbędne. Próbowałem je zabić i stwierdziłem, że programy konsoli nadal działają, zarówno dla programów korzystających z okna konsoli, jak i tych, które nie działają (jak serwery).
Znam już cały csrss.exe
⇨ Windows Vista ⇨conhost.exe
i wielokrotnie widziałem to samo (prawie dosłownie) wyjaśnienie . Problem polega na tym, że wszyscy po prostu kopiują i wklejają to samo wyjaśnienie, które nie jest pomocne. Wszystko, co mówi, to to, że w XP-, konsolowych aplikacjach, gdzie „hostowane przez” lub „uruchamiane pod” csrss.exe
, ale w Windows 7 zostały przeniesione do conhost.exe
bezpieczeństwa. Aspekt bezpieczeństwa ma sens, ale nie mówi nic o tym, co to znaczy go hostować ani dlaczego / kiedy jest to konieczne (lub czy można tego uniknąć, jeśli nie jest to konieczne). Nawet dyskusja Raymonda Chena na ten temat ukazuje, dlaczego w ogóle aplikacje konsolowe są hostowane inaczej.
Najbliższe szczegółowe wyjaśnienie techniczne mogę znaleźć na blogu Microsoft, który wydaje się potwierdzać pogląd, że chodzi tylko o GUI i okno aplikacji konsolowej. To sprawia, że zastanawiam się jeszcze bardziej, czy conhost.exe
jest to konieczne w przypadku programów bez okien, takich jak te serwery. Jeśli w ogóle nie ma okna, to dlaczego miałbym marnować zasoby i zaśmiecać przestrzeń procesową niepotrzebnymi procesami? Dlaczego system Windows nie może wykryć, gdy jest to niepotrzebne i go uniknąć? SecurityMatt za odpowiedź była również nieznacznie użyteczne w odniesieniu do technicznego wyjaśnienia, ale znowu nie na tyle informacji szukam.
Nie jestem jedynym, który próbował znaleźć sposób na powstrzymanie niepotrzebnych przypadków conhost
. Ta osoba zapytała o wyłączenie i powiedziano jej po prostu „nie jest to możliwe”, bez dalszych wysiłków lub myśli o tym. Hugh D i „Hardly a feature” wskazali na problem z licznymi, nadmiarowymi instancjami conhost
(przynajmniej z csrss
uruchomioną tylko jedną kopią), w tym z wykorzystaniem zasobów i instancjami trwałymi po zakończeniu ich procesów potomnych. I Laufer zastanawiał się, czy / kiedy jest to konieczne.
Obserwacje i próby rozwiązania
Jeśli nie są one faktycznie konieczne przez cały czas (ponownie, nie widziałem żadnych złych skutków ich zabicia), to przypuszczam, że mógłbym (bardzo irytująco) obejść ten problem, zastępując serwery plikami wsadowymi, które uruchamiają serwery , poczekaj, a następnie zabij kopię conhost
, którą powodują. Oczywiście wymaga to szybkiego i łatwego sposobu ustalenia, który to jest. FallenGameR zapytał, jak uzyskać instancję conhost.exe
skojarzoną z programem konsolowym o danym PID, ale nie otrzymał odpowiedzi. Myślę, że po prostu pobranie PID procesu nadrzędnego powinno załatwić sprawę (nie, ProcessExplorer nie jest opcją, automatyczny / skryptowyrozwiązanie jest wymagane), ale nie tylko wymagałoby stworzenia jakiegoś frameworka, aby uzyskać PID dziecka (zamiast po prostu uruchomić go i wykonać zadanie), ale oznaczałoby to również wymyślenie sposobu, aby był kompatybilny także z XP (np. sprawdzenie nazwy obrazu procesu nadrzędnego). Ten post na blogu podaje jeden sposób, ale wymaga programu PowerShell i nie jest idealny, nie wspominając o tym, że nie mówi nic o konsekwencjach uruchomienia skryptu.
Pytania)
Być może Microsoft stwierdził, że nikt już nie używa wierszy poleceń (* kaszel * Windows 8 * kaszel *) i dlatego założył, że nie jest wielkim problemem, aby je obciążać, ale zdecydowanie są scenariusze, w których działa wiele aplikacji konsolowych i każdy z nich ma swoje spawnowanie dodatkowego, pochłaniającego pamięć procesu wykorzystującego PID jest okropne, a próba obejścia go jest w najlepszym wypadku okropnie niewygodna.
Czy ktoś ma ostateczne, wiarygodne informacje w tej sprawie? Znów przeczytałem już ogólne wyjaśnienie; Zastanawiam się:
- Dlaczego aplikacje konsolowe muszą (nadal) być w ogóle obsługiwane inaczej?
- W jakich konkretnych okolicznościach muszą mieć
conhost
- Jakie są konsekwencje zabijania
conhost
- Czy jest jakiś sposób, aby go zatrzymać / zapobiec / wyłączyć / zablokować lub przynajmniej łatwy sposób, aby szybko sobie z tym poradzić?
conhost.exe
jest to odpowiednik PTY dla systemu Windows i cmd.exe
jest to powłoka.
conshost.exe
wciąż się pojawia ?