(Kapan) apakah CONHOST.EXE sebenarnya perlu?


23

Latar Belakang

Tahun lalu saya menyusun sistem blog / web-server portabel yang dapat saya jalankan dari flash-drive. Ini hebat dan bekerja dengan sangat baik, terutama pada XP. Masalahnya adalah bahwa ketika dijalankan di Windows 7, setiap program konsol memunculkan dua proses, proses itu sendiri, ditambah salinan conhost.exe.

Masalah

Dalam kasus sistem blog portabel, masing-masing komponen servernya (MySQL mysqld.exe, dua instance Apache, dua instance httpd.exeVisualSVN visualsvnserver.exe, dan beberapa instance PHP php-cgi.exe) memunculkan instance conhost.exe. Pada saat ini (tanpa salinan yang php-cgi.exeaktif, saya memiliki lima contoh conhost.exemenjalankan, menggunakan hampir tidak ada siklus CPU, tetapi mengkonsumsi memori 22MB (selain 80MB bahwa proses aktual saat ini menggunakan).

Penelitian

Sejak Windows 7 dirilis (dan saya pikir mungkin sejak Vista), saya harus beberapa kali mencoba untuk mencari tahu persis apa tujuan berbagai proses (baru) host (misalnya, conhost.exe, dllhost.exe, dan taskhost.exe) lakukan dan apakah mereka benar-benar diperlukan. Saya telah mencoba membunuh mereka dan menemukan bahwa program konsol terus bekerja, baik untuk program yang menggunakan jendela konsol, dan yang tidak (seperti server).

Saya sudah terbiasa dengan keseluruhan csrss.exe⇨ Windows Vista ⇨conhost.exe dan telah melihat penjelasan yang sama (hampir kata demi kata) beberapa kali. Masalahnya adalah semua orang hanya menyalin-paste penjelasan yang sama yang tidak membantu. Yang dikatakannya adalah bahwa di XP-, aplikasi konsol di mana "dihosting oleh" atau "dijalankan di bawah" csrss.exe, tetapi di Windows 7, mereka dipindahkan ke conhost.exeuntuk keamanan. Aspek keamanan masuk akal, tetapi tidak mengatakan apa artinya meng-host-nya atau mengapa / kapan itu diperlukan (atau apakah mungkin untuk menghindarinya jika tidak perlu). Bahkan diskusi Raymond Chen tentang masalah ini menjelaskan mengapa aplikasi konsol dihosting secara berbeda sama sekali.

Hal terdekat yang dapat saya temukan pada penjelasan teknis yang terperinci adalah sebuah posting blog Microsoft yang sepertinya memperkuat gagasan bahwa ini hanya tentang GUI dan jendela aplikasi konsol. Ini membuat saya bertanya-tanya lebih keras apakah conhost.exediperlukan untuk program tanpa jendela seperti server ini. Jika tidak ada jendela sama sekali, lalu mengapa saya harus membuang sumber daya dan mengacaukan ruang proses dengan proses yang tidak perlu? Mengapa Windows tidak dapat mendeteksi ketika tidak perlu dan menghindarinya? Tanggapan SecurityMatt juga sedikit berguna dalam hal penjelasan teknis, tetapi sekali lagi, tidak cukup informasi yang saya cari.

Saya bukan satu-satunya yang telah mencoba mencari cara untuk menghentikan contoh yang tidak perlu conhost. Orang ini bertanya tentang menonaktifkannya dan diberi tahu hanya "tidak mungkin" tanpa usaha lebih lanjut atau memikirkannya. Hugh D dan “Hardly a feature” menunjukkan masalah dengan banyak, contoh berlebihan conhost(setidaknya dengan csrss, hanya ada satu salinan berjalan), termasuk penggunaan sumber daya dan contoh yang tersisa setelah proses anak-anak mereka berakhir. I Laufer mempertanyakan apakah / kapan itu perlu.

Pengamatan dan Upaya Solusi

Jika mereka tidak benar-benar diperlukan setiap saat (sekali lagi, saya belum melihat efek buruk dari membunuh mereka), maka saya kira saya bisa (sangat menjengkelkan) mengatasi masalah dengan mengganti server dengan file batch yang menjalankan server , tunggu, lalu bunuh salinan conhostyang mereka jalankan. Tentu saja ini membutuhkan cara yang cepat dan mudah untuk menentukan yang mana itu. FallenGameR bertanya bagaimana mendapatkan instance yang conhost.exeterkait dengan program konsol PID yang diberikan tetapi tidak mendapatkan jawaban. Saya akan berpikir bahwa hanya mengambil PID dari proses induk harus melakukan trik (tidak, ProcessExplorer bukan pilihan, otomatis / skripsolusi diperlukan), tetapi tidak hanya akan membutuhkan pembuatan semacam kerangka kerja untuk mendapatkan PID anak (bukan hanya menjalankannya dan selesai dengan tugas), tetapi itu juga berarti mencari cara untuk membuatnya kompatibel dengan XP juga (misalnya, memeriksa nama-gambar dari proses induk). Posting blog ini memberikan satu cara, tetapi membutuhkan PowerShell dan hampir tidak ideal, belum lagi tidak menyebutkan konsekuensi dari menjalankan skrip.

Pertanyaan

Mungkin Microsoft memperkirakan bahwa tidak ada lagi yang menggunakan perintah-perintah (* batuk * Windows 8 * batuk *) dan dengan demikian diasumsikan bahwa itu bukan masalah besar untuk membebani mereka, tetapi pasti ada skenario di mana beberapa aplikasi konsol berjalan dan memiliki masing-masing dan setiap satu menelurkan proses yang ekstra, memakan memori, menggunakan PID adalah mengerikan, dan mencoba untuk mengatasinya, paling tidak, sangat tidak nyaman.

Adakah yang punya informasi definitif dan resmi tentang masalah ini? Sekali lagi, saya sudah membaca penjelasan umum; Saya bertanya-tanya:

  1. Mengapa aplikasi konsol harus (masih) ditangani secara berbeda sama sekali
  2. Dalam keadaan spesifik apa mereka perlu memilikiconhost
  3. Apa akibatnya dari membunuhconhost
  4. Jika ada cara untuk menghentikan / mencegah / menonaktifkan / memblokirnya atau setidaknya cara mudah untuk segera menghadapinya?

1
Sebelum ada orang yang ingin menautkannya (atau memilih untuk menutup sebagai duplikatnya, saya sudah melihat pertanyaan lain di sini seperti [yang ini]). Seperti yang saya katakan, menyeret-dan-menjatuhkan file ke aplikasi konsol tanpa jendela tidak relevan, jadi mengapa conshost.exemasih memijah?
Synetech

1
Dari apa yang saya baca, bagian dari masalahnya adalah bahwa Windows tidak menangani konsol seperti * nix. Mereka bukan hanya perangkat karakter, dan tidak dapat dioperasikan sama sekali (Ada diskusi yang sangat baik tentang ini di bawah permintaan fitur Putty untuk mendukung menggunakan Putty sebagai terminal perintah lokal). Saya selalu mengira conhost.exeitu setara dengan Windows dari PTY, dan cmd.exeitu adalah shell.
Darth Android


@ techie007, itulah halaman yang saya (coba) tautkan dalam komentar saya di atas .
Synetech

Jawaban:


19
  1. Aplikasi konsol harus ditangani secara berbeda karena di bawah kernel NT (yang mendasari semua 2000, XP, Vista, Windows 7, dan Windows 8) mereka adalah warga negara kelas dua. Dalam arsitektur sistem Unix, setiap proses pada waktu pembuatan memiliki input standar, output, dan stream kesalahan yang melekat padanya; terminal IO diterapkan dalam hal aliran ini (stdin berasal dari keyboard, dan stdout / stderr pergi ke terminal), dan upaya ekstra diperlukan pada bagian dari proses yang tidak ingin memanfaatkan aliran tersebut atau memiliki deskriptor file mereka terbuka.

    Dalam arsitektur Windows NT, yang walaupun bukan keturunan linier VMS dikembangkan oleh tim yang kurang lebih sama, kebalikannya adalah benar; proses yang baru saja muncul secara default tidak memiliki aliran I / O yang terhubung dengannya, dan tidak ada konsep seperti "terminal". Program yang ingin berperilaku sedikit lebih Unixy dapat meminta (dengan deklarasi waktu kompilasi) yang dibuat oleh sistem untuk mereka jendela konsol, dan aliran input / output yang terhubung dengannya; sistem akan melakukannya, tetapi karena Windows, tidak seperti Unix, tidak memberi Anda terminal gratis, sejumlah besar upaya tambahan diperlukan untuk membuatnya, sehingga sebelumnya csrss.exe, dan sekarang conhost.exe.

    Adapun perbedaan antara keduanya, tautan "Hampir tidak Anda miliki" menjelaskannya dengan cukup memadai; singkatnya, ia ada untuk mengatasi kelemahan keamanan dalam iterasi sebelumnya dari API konsol Windows yang sangat rekondisi, yang memungkinkan untuk peningkatan hak istimewa dalam versi NT yang lebih tua dari Windows 7. (Vista, FYI, tidak memiliki conhost.exe, yang sesuai dengan kemampuannya. status sebagai Milenium Windows dari keluarga NT.)

  2. Setiap program yang menginginkan padanan Unix stdin / stdout / stderr memerlukan konsol, karenanya merupakan instance dari conhost.exe. Imigran dari Unix-land, seperti Apache, PHP, dkk., Akan menginginkan stream ini, karenanya instantiasi otomatis sistem conhost.exeuntuk mereka, apakah mereka benar-benar menampilkan jendela atau tidak. Secara teori, dimungkinkan untuk memodifikasi sumber untuk mis. Apache sedemikian sehingga tidak memerlukan terminal, dan mengompilasinya sebagai aplikasi Windows GUI alih-alih aplikasi konsol, sehingga sistem tidak akan merasa perlu menelurkannya conhost.exe. Dengan asumsi itu juga mungkin dalam praktiknya, tampaknya tidak ada yang cukup peduli untuk melakukannya. Mungkin Anda akan menjadi yang pertama.

  3. Membunuh yang diberikan conhost.exehampir pasti akan menonaktifkan konsol IO untuk proses apa pun yang berjalan di bawah contoh itu. Anda mungkin tidak peduli tentang itu karena Anda berurusan dengan proses server yang tidak melakukan sesuatu yang menarik pada konsol IO stream, jadi mungkin tidak ada alasan untuk tidak membunuh mereka conhost.exe. Jika ragu, bunuh mereka dan lihat apakah itu merusak sesuatu.

  4. Tidak ada cara untuk mencegah Windows dari instantiating conhost.exeketika sebuah program diluncurkan yang meminta konsol IO; satu-satunya cara untuk melakukannya adalah mengkompilasi ulang sehingga Windows tidak menganggapnya sebagai aplikasi konsol. Namun, dengan asumsi bahwa membunuh orang tua proses server tertentu conhost.exetidak merusak fungsinya dengan cara apa pun yang Anda pedulikan, Anda harus dapat membunuh mereka sekaligus dengan menerbitkan taskkill /f /im conhost.exedi Run prompt atau jendela konsol - lebih disukai yang sebelumnya, karena yang terakhir mungkin akan mati, dan hampir pasti berhenti bekerja, segera setelah orang tuanya conhost.exedibunuh. Sekali lagi, jika ragu, bunuh mereka dan lihat apakah itu merusak sesuatu.


5
Semua yang mengatakan, tumpukan server portabel pada Flash drive terdengar seperti itu tidak pernah menghabiskan banyak waktu berjalan pada mesin yang diberikan, dan 22M kira-kira 1% dari pelengkap RAM dari mesin kelas bawah yang Anda bahkan dapat dengan mudah membeli hari ini. Apakah benar-benar masalah yang layak untuk mendapatkan banyak waktu dan upaya ini?
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 Saya tidak tahu apa artinya ini. Apakah Anda berbicara tentang siklus CPU? Jika demikian, maka server web bisa menjadi sangat palu jika situsnya cukup populer (dan dipalu bahkan jika tidak; PHP pada Windows tidak persis murah CPU). Jika maksud Anda seberapa sering dijalankan secara umum, saya membiarkannya berjalan di laptop saya sepanjang minggu.
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? Anda tidak menjalankan server web pribadi pada mesin baru, Anda menjalankannya pada sistem lama yang tidak berguna untuk hal lain. (Pada tahun 1997 seorang teman mengatakan kepada saya bahwa ia menjalankan server web Linux pada sistem yang lama dan minimal — menurut standar waktu itu). Karena ini portabel, ia harus dapat serapat mungkin kompatibel. Dan itu bukan hanya memori ; untuk satu hal, itu juga mencemari ruang proses dan mengacaukan Task Manager.
Synetech

Vista, FYI, does not have conhost.exe, which is befitting of its status as the Windows Millennium of the NT family. Itu sebabnya saya menempatkan Vista antara csrsske conhost; itu adalah langkah tengah. Sedangkan untuk Windows ME yang buruk, jangan seburuk itu. Saya baru-baru ini memainkan ulang Permata dari Oracle dengan menjalankannya di XP di VMPlayer, tetapi ketika saya mencoba memainkan Permata II , saya tidak bisa. Itu tidak akan berjalan di XP atau 2000. Ini berjalan di 98, tetapi 98 memiliki dukungan audio-video yang buruk di VMPlayer dan VirtualBox. Setelah selusin upaya, saya menemukan bahwa satu-satunya kombinasi OS & VM yang memungkinkan permainan bekerja dengan benar adalah ME di VMPlayer.
Synetech

4
Dalam urutan: Ketika saya mendengar "tumpukan server portabel pada drive Flash", saya pikir "pengguna tidak dapat mendedikasikan kotak untuk itu dan membutuhkannya mudah dipindah-pindahkan di antara mesin", karena tidak ada alasan lain yang baik untuk melakukannya dengan cara itu. Jika Anda sudah berurusan dengan overhead VM, mengapa tidak menjalankan server server Anda pada Linux VM? Tidak conhost.exeseperti itu. Dan untuk Windows ME, saya harus mencoba untuk mendukungnya kembali ketika masih baru, dan Anda dapat mengutip semua kasus sudut tidak jelas yang Anda sukai tanpa mengalah pendapat saya tentang sarapan anjing OS, yang dapat saya lupakan sepanjang hari tanpa melakukannya keadilan.
Aaron Miller

7

Aplikasi konsol yang dimulai dengan DETACHED_PROCESSflag tidak mendapatkan konsol atau proses anak conhost. Masalahnya adalah bahwa flag tidak berlaku untuk cucu-cucu sehingga hanya akan bekerja dengan proses yang Anda mulai secara langsung (jika Anda bahkan dapat menemukan utilitas yang memungkinkan Anda untuk menentukan flag ini).

Opsi lain yang mungkin berfungsi adalah jika proses konsol memanggil FreeConsole()fungsi. Beberapa aplikasi server mendukung parameter -d atau -detach tapi ini mungkin lebih umum pada sistem * nix ...


1
Itu terdengar brilian. Tidak ada halaman yang disebutkan conhost, tetapi koneksi tampaknya cukup jelas. Saya akan melakukan beberapa tes untuk melihat efek apa yang dimilikinya.
Synetech

2

Solusi cepat yang mungkin cocok untuk Anda. Saat menautkan aplikasi Anda tambahkan / SUBSYSTEM: WINDOWS ke opsi. Anda juga bisa menggunakan editbin.exe untuk memodifikasi executable yang ada.

Ini mencegah windows memunculkan conhost.exe untuk aplikasi Anda.


Kedengarannya menjanjikan, tetapi saya hanya mencobanya dan tidak berhasil. Saya menggunakannya untuk mengubah subsistem mysqld, tetapi ketika saya menjalankannya, itu masih menelurkan conhostinstance.
Synetech

Mungkinkah itu stderrmasih diperlukan untuk mysqlddan, dengan demikian, dibutuhkan conhost?
David T. Macknet
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.