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.exe
VisualSVN visualsvnserver.exe
, dan beberapa instance PHP php-cgi.exe
) memunculkan instance conhost.exe
. Pada saat ini (tanpa salinan yang php-cgi.exe
aktif, saya memiliki lima contoh conhost.exe
menjalankan, 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.exe
untuk 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.exe
diperlukan 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 conhost
yang mereka jalankan. Tentu saja ini membutuhkan cara yang cepat dan mudah untuk menentukan yang mana itu. FallenGameR bertanya bagaimana mendapatkan instance yang conhost.exe
terkait 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:
- Mengapa aplikasi konsol harus (masih) ditangani secara berbeda sama sekali
- Dalam keadaan spesifik apa mereka perlu memiliki
conhost
- Apa akibatnya dari membunuh
conhost
- Jika ada cara untuk menghentikan / mencegah / menonaktifkan / memblokirnya atau setidaknya cara mudah untuk segera menghadapinya?
conshost.exe
masih memijah?conhost.exe
itu setara dengan Windows dari PTY, dancmd.exe
itu adalah shell.Jawaban:
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 sekarangconhost.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.)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 sistemconhost.exe
untuk 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 menelurkannyaconhost.exe
. Dengan asumsi itu juga mungkin dalam praktiknya, tampaknya tidak ada yang cukup peduli untuk melakukannya. Mungkin Anda akan menjadi yang pertama.Membunuh yang diberikan
conhost.exe
hampir 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 merekaconhost.exe
. Jika ragu, bunuh mereka dan lihat apakah itu merusak sesuatu.Tidak ada cara untuk mencegah Windows dari instantiating
conhost.exe
ketika 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 tertentuconhost.exe
tidak merusak fungsinya dengan cara apa pun yang Anda pedulikan, Anda harus dapat membunuh mereka sekaligus dengan menerbitkantaskkill /f /im conhost.exe
di Run prompt atau jendela konsol - lebih disukai yang sebelumnya, karena yang terakhir mungkin akan mati, dan hampir pasti berhenti bekerja, segera setelah orang tuanyaconhost.exe
dibunuh. Sekali lagi, jika ragu, bunuh mereka dan lihat apakah itu merusak sesuatu.sumber
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.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.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 antaracsrss
keconhost
; 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.conhost.exe
seperti 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.Aplikasi konsol yang dimulai dengan
DETACHED_PROCESS
flag 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 ...sumber
conhost
, tetapi koneksi tampaknya cukup jelas. Saya akan melakukan beberapa tes untuk melihat efek apa yang dimilikinya.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.
sumber
mysqld
, tetapi ketika saya menjalankannya, itu masih menelurkanconhost
instance.stderr
masih diperlukan untukmysqld
dan, dengan demikian, dibutuhkanconhost
?