(Ne zaman) CONHOST.EXE gerçekten gerekli mi?


23

Arka fon

Geçen yıl bir flash sürücüden çalıştırabileceğim taşınabilir bir blog / web sunucusu sistemini derledim. Harika ve harika çalışıyor, özellikle de XP'de. Sorun şu ki, Windows 7'de çalıştırıldığında, her konsol programının iki işlem, işlemin kendisi ve bunun bir kopyası ortaya çıkıyor conhost.exe.

Sorun

Taşınabilir blog sistemi durumunda, sunucu bileşenlerinin her biri (MySQL'ler mysqld.exe, Apache'nin iki örneği httpd.exe, VisualSVN'nin iki örneği visualsvnserver.exeve PHP'nin birden çok örneği php-cgi.exe) bir örneği ortaya çıkarır conhost.exe. Şu anda ( php-cgi.exeetkin kopya conhost.exeyokken, CPU döngüsünün yanında, ancak 22 MB bellek tüketen (gerçek işlemlerin şu anda kullandığı 80 MB'a ek olarak) kullanan beş çalışan örneğim var.

Araştırma

Windows 7 serbest bırakıldı (ve Vista beri muhtemelen düşünüyorum), ben anlamaya çalıştık çeşitli vesilelerle var tam olarak çeşitli (yeni) konak süreçleri (örneğin, hangi amaçla conhost.exe, dllhost.exeve taskhost.exe) yapmak ve ister aslında gereklidir. Onları öldürmeye çalıştım ve konsol programlarının hem konsol penceresi kullanan programlar hem de (sunucular gibi) programlarda çalışmaya devam ettiğini gördüm.

Ben zaten tüm " csrss.exeWindows Vista" ile tanıştımconhost.exe ve aynı (neredeyse sözlü) bir açıklama defalarca gördüm . Sorun şu ki, herkes basitçe yardımcı olmayan aynı açıklamayı kopyalar. Tek söylediği, XP’de “barındırdığı” veya “altından geçtiği” konsol uygulamalarında csrss.exe, ancak Windows 7’de conhost.exegüvenlik için taşındıkları . Güvenlik yönü anlamlıdır, ancak onu barındırmanın ne anlama geldiği veya neden / ne zaman gerekli olduğu (veya gerekmediği takdirde önlenmesinin mümkün olup olmadığı) hakkında hiçbir şey söylemez. Raymond Chen'in konuyla ilgili tartışması bile , konsol uygulamalarının neden farklı bir şekilde barındırıldığına dair açıklıyor.

Detaylı, teknik bir açıklama bulabileceğim en yakın şey, yalnızca konsol uygulamasının GUI'sı ve penceresiyle ilgili olduğu fikrini pekiştirmiş görünen Microsoft blog yazısı . Bu conhost.exe, bu sunucular gibi penceresiz programlar için gerekli olup olmadığını daha da merak etmemi sağlıyor . Hiç bir pencere yoksa neden kaynakları boşa harcamalıyım ve gereksiz yere işlem alanını karıştırmalıyım? Windows neden gereksiz olduğunu tespit edip önleyemiyor? SecurityMatt’ın cevabı da teknik bir açıklama açısından biraz yararlı oldu, ancak yine de aradığım bilgilerin yeterli değildi.

Gereksiz örnekleri durdurmanın bir yolunu bulmaya çalışan tek kişi ben değilim conhost. Bu kişiye , onu devre dışı bırakmak istedi ve daha fazla çaba göstermeden ya da düşünülmeden basitçe “mümkün değil” denildi. Hugh D ve “Neredeyse bir özellik” konuyu , çocuk kullanımı sona erdikten sonra kaynak kullanımı ve kalan örnekler de dahil olmak üzere çok sayıda, gereksiz conhost(en azından csrssyalnızca tek bir kopyanın yayınlandığını) gösteren örneklerle belirtti. Laufer gerekli olduğunda bile / ne zaman sorguladım.

Gözlemler ve Çözüm Girişimleri

Aslında her zaman gerekli olmazlarsa (tekrar, onları öldürmekten kötü bir etki görmedim), o zaman sanırım sunucuları çalıştıran sunucuları toplu iş dosyalarıyla değiştirerek, sorunu giderebilirim (çok rahatsız edici) , bekle ve sonra conhostkaçmalarının bir kopyasını öldür . Elbette bu, hangisinin olduğunu belirlemenin hızlı ve kolay bir yolunu gerektirir. FallenGameR , verilen bir PID'ninconhost.exe bir konsol programıyla ilişkilendirilmiş örneğini nasıl elde edeceğini sordu ancak bir cevap alamadı. Ana işlemin PID'sini almanın hile yapması gerektiğini düşünüyorum (hayır, ProcessExplorer bir seçenek değil, otomatik / komut dosyasıyla yazılabilir).çözüm gereklidir), ancak yalnızca çocuğun Kimliğini almak için bir tür çerçeve oluşturmayı gerektirmez (yalnızca çalıştırma ve görevi yerine getirmek yerine), aynı zamanda onu uyumlu hale getirmenin bir yolunu bulmak anlamına da gelir. XP ile de (ör. ana sürecin görüntü ismini kontrol ederek). Bu blog yazısı bir yol gösteriyor, ancak PowerShell'i gerektiriyor ve senaryoyu çalıştırmanın sonuçları hakkında hiçbir şey söylemediğinden bahsetmek zor değil.

Soru (lar)

Belki de Microsoft hiç kimsenin artık komut istemleri kullanmadığını (* öksürük * Windows 8 * öksürük *) ve bu yüzden onları zorlamak için büyük bir sorun olmadığını varsayıyor, ancak birden fazla konsol uygulamasının çalıştığı ve her birinin bulunduğu senaryolar var. Ekstra, bellek tüketen, PID kullanan bir süreç oluşturmak çok zordur ve bunun üzerinde çalışmaya çalışmak en iyi ihtimalle korkunç derecede sakıncalıdır.

Bu konuda kesin ve yetkili bilgileri olan var mı? Yine, genel açıklamayı zaten okudum; Merak ediyorum:

  1. Konsol uygulamaları neden (hala) farklı şekilde ele alınmalı?
  2. Hangi belirli şartlar altında bunlar ihtiyaç varconhost
  3. Sonuçları öldürmenin ne olduğuconhost
  4. Durdurmanın / engellemenin / devre dışı bırakmanın / engellemenin ya da en azından hızlıca başa çıkmanın kolay bir yolu varsa?

1
Herhangi biri onunla bağlantı kurmayı zorlamadan önce (veya kopya olarak kapanmaya oy vermeden önce, burada [bu] gibi başka sorular da gördüm.) Dediğim gibi, bir dosyayı penceresiz bir konsol uygulamasına sürükleyip bırakmak önemli değil, peki neden conshost.exehala doğuyor?
Synetech

1
Okuduklarımdan, sorunun bir parçası, Windows'un * nix gibi konsolları kullanmamasıdır. Bunlar sadece karakter cihazları değildir ve bunlar arasında birlikte çalışamazlar (PuTTY özelliği isteği altında PuTTY'yi yerel bir komut terminali olarak kullanmayı desteklemek için bu konuda çok iyi bir tartışma var). Her zaman conhost.exeWindows’un bir PTY’ye eşdeğer cmd.exeolduğunu ve kabuk olduğunu düşündüm .
Darth Android


@ techie007, içeri bağlantısını (çalıştı) o sayfası olduğu yukarıdaki benim yorum .
Synetech

Yanıtlar:


19
  1. Konsol çekirdeği uygulamaları farklı şekilde ele alınmalıdır çünkü NT çekirdeğinin altında (2000, XP, Vista, Windows 7 ve Windows 8'in temelini oluşturur) bunlar ikinci sınıf vatandaşlardır. Unix sistem mimarisinde, yaratılış sırasındaki her işlem kendisine eklenmiş standart girdi, çıktı ve hata akışlarına sahiptir; terminal IO bu akışlar (klavyeden gelen stdin ve stdout / stderr terminale gidiyor) açısından uygulanır ve bu akışlardan faydalanmak istemeyen veya sahip olmak istemediğiniz bir süreç için ekstra çaba gerekir. dosya tanımlayıcıları açılır.

    Aynı ekip tarafından aşağı yukarı VMS soyundan gelmeyen Windows NT mimarisinde bunun tersi doğrudur; yeni ortaya çıkmış bir işlem varsayılan olarak kendisine bağlı hiçbir G / Ç akışına sahip değildir ve “terminal” diye bir kavram yoktur. Biraz daha fazla Unixy tarzında davranmak isteyen programlar, sistemin kendileri için bir konsol penceresi oluşturmasını ve buna bağlı giriş / çıkış akışlarını; sistem bunu yapacak, ancak Windows, Unix’in aksine, size ücretsiz olarak terminaller vermediğinden, eski csrss.exeve şimdi bir tane oluşturmak için önemli miktarda ek çaba gerekiyor conhost.exe.

    İkisi arasındaki farka gelince, "Neredeyse bir özellik" bağlantınız bunu yeterince açıklar; Kısacası, önceki Windows sürümlerinde Windows 7'den daha eski olan NT sürümlerinde ayrıcalık yükselmesine izin veren Windows'un yeniden yapılandırılmış konsol API'si yinelemesinde bir güvenlik açığı etrafında çalışmaktadır conhost.exe. NT ailesinin Windows Millennium'u statüsü.)

  2. Unix stdin / stdout / stderr'in eşdeğerini isteyen herhangi bir programın bir konsola ihtiyacı vardır, bu nedenle bir örneği vardır conhost.exe. Apache, PHP ve diğerleri gibi Unix-Land'den gelen göçmenler bu akışları isteyeceklerdir, bu nedenle sistemin conhost.exeaslında bir pencere gösterip göstermemelerini isterlerse otomatik olarak başlatmaları . Teoride, örneğin Apache'nin kaynağını terminal gerektirmeyecek şekilde değiştirmek ve bir konsol uygulaması yerine bir Windows GUI uygulaması olarak derlemek mümkün olacaktı, böylece sistem onu ​​bir spawn'a ihtiyaç duymayacaktı conhost.exe. Uygulamada da mümkün olduğunu varsayarsak, bunu yapacak kadar kimse umursamıyormuş gibi görünüyor. Belki de ilk sen olacaksın.

  3. Belirli bir conhost.exekişinin öldürülmesi , bu durumda hangi işlemin gerçekleştirildiğine bağlı olarak konsol IO'yu kesinlikle devre dışı bırakır. Muhtemelen bunu umursamıyorsunuz çünkü konsolda G / Ç akışında ilginç bir şey yapmayan sunucu işlemleriyle uğraşıyorsunuz, bu yüzden muhtemelen s'larını öldürmemek için bir neden yok conhost.exe. Şüpheniz varsa, onları öldürün ve bir şey kırıp kırmadığına bakın.

  4. conhost.exeKonsol IO isteyen bir program başlatıldığında Windows'un başlatılmasını önlemenin bir yolu yoktur ; Bunu yapmanın tek yolu, onu bir konsol uygulaması olarak görmemesi için yeniden derlemektir. Bununla birlikte, belirli bir sunucu işleminin ebeveyninin öldürülmesinin conhost.exeişlevini umursadığınız herhangi bir şekilde bozmadığı varsayılırsa, taskkill /f /im conhost.exebir Çalıştır isteminde veya bir konsol penceresinde - tercihen eski olan ikincisi büyük olasılıkla ölecek ve neredeyse kesin olarak çalışmamaya başlanacak, ana conhost.exevakası öldürüldüğünde. Yine, eğer şüpheniz varsa, onları öldürün ve bir şeyin kırılıp kırılmadığını görün.


5
Bütün bunlar, bir Flash sürücüdeki taşınabilir bir sunucu yığınının herhangi bir makinede çalışmakta çok fazla zaman harcamamış gibi ses çıkardığını ve 22M'nin kabaca en düşük uçtaki makinenin RAM tamamlayıcısının% 1'ini bile bu günlerde kolayca satın alabileceğiniz anlamına geliyor. Gerçekten bu kadar zamana ve emeğe değecek bir problemin olması yeterli mi?
Aaron Miller

All that said, a portable server stack on a Flash drive sounds like it never spends much time running on any given machine Bunun ne anlama geldiğini bilmiyorum. CPU döngülerinden mi bahsediyorsunuz? Öyleyse, bir web sunucusu, site yeterince popülerse (ve olmasa da dövülmüş; Windows'ta PHP tam olarak CPU ucuz değildir) oldukça dövülebilir. Genel olarak ne sıklıkta çalıştırılacağını kastediyorsanız, tüm hafta boyunca dizüstü bilgisayarımda çalışmasına izin veririm.
Synetech

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? Kişisel bir web sunucusunu yeni bir makinede çalıştırmazsınız, onu başkaları için kullanışlı olmayan eski bir sistemde çalıştırırsınız. (1997'de bir arkadaşım eskiden ve minimumda bir Linux web sunucusu çalıştırdığını söyledi - o zamanın standartlarına göre).) Taşınabilir olduğu için mümkün olduğu kadar uyumlu olması gerekiyordu. Ve bu sadece hafıza değil ; Birincisi, aynı zamanda süreç alanını kirleten ve Görev Yöneticisi debriyajıdır.
Synetech

Vista, FYI, does not have conhost.exe, which is befitting of its status as the Windows Millennium of the NT family. Ben arasına Vista koyuyoruz csrssiçin conhost; orta adımdı. Zavallı Windows ME'ye gelince, sakın kötü konuşma. Geçenlerde Oracle'ın Jewels'ını VMPlayer'da XP'de çalıştırarak yeniden oynadım, ancak Jewels II oynamaya çalıştığımda yapamadım. XP veya 2000'de çalışmaz. 98'de çalışır, ancak 98'inin VMPlayer ve VirtualBox'ta zayıf ses-video desteği vardır. Bir düzine denemeden sonra, oyunun doğru çalışmasını sağlayan OS & VM kombinasyonunun VMPlayer'da ME olduğunu buldum.
Synetech

4
Sırayla: "Bir Flash sürücüdeki taşınabilir sunucu yığını" duyduğumda, "kullanıcının bir kutu ayıramayacağını ve makinelerin arasında kolayca hareket edebilmesini istediğini" düşünüyorum, çünkü bu şekilde yapmanın başka iyi bir nedeni yok. Zaten VM ek yükü ile uğraşıyorsanız, neden web sunucusu yığınınızı bir Linux VM'de çalıştırmıyorsunuz? Hayır conhost.exeöyle. Ve Windows ME’ye gelince, yeniyken onu tekrar desteklemeye çalışmak zorunda kaldım ve köpeğin bütün gün kötülük edebileceğim bir işletim sistemi kahvaltısı hakkında fikrimden ödün vermeden, sevdiğiniz tüm karanlık, gecikmiş köşe davalarını anlatabilirsiniz adalet yapmadan.
Aaron Miller

7

DETACHED_PROCESSBayrakla başlatılan bir konsol uygulaması bir konsol veya bir alt yapı işlemi almaz. Sorun şu ki, bayrak büyük çocuklara uygulanmaz, bu yüzden yalnızca doğrudan başladığınız süreçlerle çalışır (bu bayrağı belirlemenizi sağlayan bir yardımcı program bulabilirseniz bile).

İşe yarayabilecek diğer seçenek, konsol işleminin FreeConsole()işlevi çağırmasıdır. Bazı sunucu uygulamaları -d veya -detach parametresini destekler, ancak bu * nix sistemlerinde daha yaygındır ...


1
Kulağa harika geliyor. Bu sayfaların hiçbiri belirtmiyor conhost, ancak bağlantı oldukça açık görünüyor. Ne tür etkileri olduğunu görmek için bazı testler yapacağım.
Synetech

2

Sizin için işe yarayabilecek hızlı çözüm. Uygulamanızı bağlarken / SUBSYSTEM: WINDOWS seçeneklerine ekleyin. Mevcut bir yürütülebilir dosyayı değiştirmek için editbin.exe dosyasını da kullanabilirsiniz.

Bu, uygulamaların pencerelerinin conhost.exe oluşturmasını engeller.


Kulağa umut verici geliyordu, ama sadece denedim ve işe yaramadı. Bunun için alt sistemi değiştirmek için kullandım mysqld, fakat çalıştırdığımda hala bir conhostörnek doğurdu .
Synetech

Bu stderrhala gerekli mysqldve bu nedenle ihtiyacı olabilir conhostmi?
David T. Macknet
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.