sfondo
L'anno scorso ho compilato un sistema portatile di blog / web server che posso eseguire da un'unità flash. È fantastico e funziona meravigliosamente, specialmente su XP. Il problema è che quando viene eseguito in Windows 7, ciascun programma della console genera due processi, il processo stesso e una copia di conhost.exe
.
Problema
Nel caso del sistema di blog portatile, ognuno dei suoi componenti server (MySQL mysqld.exe
, le due istanze di Apache, le due istanze di httpd.exe
VisualSVN visualsvnserver.exe
e le istanze multiple di PHP php-cgi.exe
) genera un'istanza di conhost.exe
. In questo momento (senza copie php-cgi.exe
attive, ho cinque istanze di conhost.exe
esecuzione, che usano quasi i cicli della CPU, ma che consumano 22 MB di memoria (oltre agli 80 MB che i processi attuali stanno attualmente utilizzando).
Ricerca
Dal momento che Windows 7 è stato rilasciato (e penso che forse dal Vista), ho più volte cercato di capire esattamente quale scopo i vari processi (nuovo) di accoglienza (ad esempio, conhost.exe
, dllhost.exe
e taskhost.exe
) fanno e se sono effettivamente necessari. Ho provato a ucciderli e ho scoperto che i programmi della console continuano a funzionare, sia per i programmi che usano una finestra della console, sia per quelli che non lo fanno (come i server).
Ho già familiarità con l'intero csrss.exe
⇨ Windows Vista ⇨conhost.exe
e ho visto la stessa spiegazione (quasi alla lettera) più volte. Il problema è che tutti semplicemente copiano e incollano quella stessa spiegazione che non è utile. Tutto ciò che dice è che in XP, le applicazioni console dove "ospitato da" o "eseguito sotto" csrss.exe
, ma in Windows 7, sono state spostate conhost.exe
per motivi di sicurezza. L'aspetto della sicurezza ha un senso, ma non dice nulla su cosa significhi ospitarlo o perché / quando è necessario (o se è possibile evitarlo se non necessario). Anche la discussione di Raymond Chen sull'argomento spiega perché le app per console sono ospitate in modo diverso.
La cosa più vicina a una spiegazione tecnica e dettagliata è un post sul blog di Microsoft che sembra rafforzare l'idea che si tratti semplicemente della GUI e della finestra dell'app della console. Questo mi lascia ancora più difficile chiedermi se conhost.exe
sia necessario per programmi senza finestre come questi server. Se non c'è alcuna finestra, allora perché dovrei sprecare risorse e ingombrare lo spazio del processo con processi non necessari? Perché Windows non è in grado di rilevare quando non è necessario ed evitarlo? La risposta di SecurityMatt è stata anche leggermente utile per quanto riguarda una spiegazione tecnica, ma ancora una volta, non abbastanza delle informazioni che sto cercando.
Non sono l'unico che ha cercato di trovare un modo per fermare casi non necessari di conhost
. Questa persona ha chiesto di disabilitarlo e gli è stato semplicemente detto "non è possibile" senza ulteriori sforzi o pensarci. Hugh D e "Quasi una caratteristica" hanno sottolineato il problema con numerose istanze ridondanti di conhost
(almeno con csrss
, era in esecuzione una sola copia), incluso l'uso delle risorse e le istanze persistenti dopo la fine dei loro processi figlio. Laufer mi ha chiesto se / quando fosse necessario.
Osservazioni e tentativi di soluzione
Se non sono realmente necessari in ogni momento (di nuovo, non ho visto alcun effetto negativo nel ucciderli), allora suppongo che potrei (molto irritante) aggirare il problema sostituendo i server con file batch che eseguono i server , attendere e quindi uccidere la copia di conhost
ciò che eseguono. Naturalmente questo richiede un modo semplice e veloce per determinare quale sia. FallenGameR ha chiesto come ottenere l'istanza conhost.exe
associata a un programma console di un determinato PID ma non ha ottenuto una risposta. Penserei che il semplice recupero del PID del processo genitore dovrebbe fare il trucco (no, ProcessExplorer non è un'opzione, un automatizzato / gestibile da scriptè necessaria una soluzione), ma non solo ciò richiederebbe la creazione di una sorta di framework per ottenere il PID del bambino (anziché semplicemente eseguirlo e completarlo con l'attività), ma significherebbe anche trovare un modo per renderlo compatibile anche con XP (ad es. controllo del nome dell'immagine del processo genitore). Questo post sul blog fornisce un modo, ma richiede PowerShell ed è quasi l'ideale, per non parlare del fatto che non dice nulla sulle ramificazioni dell'esecuzione dello script.
Domande)
Forse Microsoft immagina che nessuno usi più i prompt dei comandi (* tosse * Windows 8 * tosse *) e quindi ha ipotizzato che non sia un grosso problema caricarli, ma ci sono sicuramente scenari in cui sono in esecuzione più app per console e ognuna con ognuna generare un processo PID in più, che consuma memoria, è terribile e, nella migliore delle ipotesi, cercare di aggirare il problema è terribilmente scomodo.
Qualcuno ha informazioni definitive e autorevoli sulla questione? Ancora una volta, ho già letto la spiegazione generica; Mi chiedo:
- Perché le applicazioni console devono (ancora) essere gestite in modo diverso
- In quali circostanze specifiche devono avere
conhost
- Quali sono le conseguenze dell'uccisione
conhost
- Se c'è un modo per fermarlo / prevenirlo / disabilitarlo / bloccarlo o almeno un modo semplice per affrontarlo rapidamente dopo?
conhost.exe
fosse l'equivalente di Windows di un PTY, ed cmd.exe
era la shell.
conshost.exe
ancora generato?