พื้นหลัง
ปีที่แล้วฉันรวบรวมระบบบล็อก / เว็บเซิร์ฟเวอร์แบบพกพาที่ฉันสามารถเรียกใช้จากแฟลชไดรฟ์ มันยอดเยี่ยมมากและใช้งานได้ยอดเยี่ยมโดยเฉพาะใน XP ปัญหาคือว่าเมื่อมันทำงานใน Windows 7 แต่ละ spawns โปรแกรมคอนโซลสองconhost.exeขั้นตอนกระบวนการของตัวเองรวมทั้งสำเนาของ
ปัญหา
ในกรณีของระบบบล็อกแบบพกพาแต่ละหนึ่งในองค์ประกอบของเซิร์ฟเวอร์ (ของ MySQL mysqld.exe, ของ Apache สองกรณีของhttpd.exe, VisualSVN ของทั้งสองกรณีของvisualsvnserver.exeและของ PHP กรณีหลายphp-cgi.exe) spawns conhost.exeเป็นตัวอย่างของ ในขณะนี้ (ที่ไม่มีสำเนาของการphp-cgi.exeใช้งานฉันมีห้าอินสแตนซ์ของการconhost.exeใช้งานโดยไม่ติดกับรอบของ CPU แต่ใช้หน่วยความจำ 22MB (นอกเหนือจาก 80MB ที่กระบวนการจริงกำลังใช้งานอยู่)
วิจัย
ตั้งแต่ Windows 7 ได้รับการปล่อยตัว (และผมคิดว่าอาจจะเป็นตั้งแต่ Vista) ผมมีหลายต่อหลายครั้งพยายามที่จะคิดออกว่าสิ่งที่วัตถุประสงค์ต่างๆกระบวนการ (ใหม่) โฮสต์ (เช่นconhost.exe, dllhost.exeและtaskhost.exe) ทำและไม่ว่าพวกเขาเป็นจริงที่จำเป็น ฉันได้ลองฆ่าพวกมันแล้วและพบว่าโปรแกรมคอนโซลยังคงทำงานต่อไปได้ทั้งสำหรับโปรแกรมที่ใช้หน้าต่างคอนโซลและที่ไม่ทำงาน (เช่นเซิร์ฟเวอร์)
ฉันคุ้นเคยกับ " csrss.exeWindows Vista" ทั้งหมดconhost.exeแล้วและได้เห็นคำอธิบายนั้น (เกือบทุกคำ) เหมือนกันหลายครั้ง ปัญหาคือทุกคนเพียงแค่คัดลอกวางคำอธิบายเดียวกันซึ่งไม่เป็นประโยชน์ ทั้งหมดที่กล่าวคือใน XP- แอปพลิเคชันคอนโซลที่“ โฮสต์โดย” หรือ“ ทำงานภายใต้” csrss.exeแต่ใน Windows 7 พวกเขาถูกย้ายไปconhost.exeเพื่อความปลอดภัย ด้านความปลอดภัยนั้นสมเหตุสมผล แต่มันไม่ได้บอกว่ามันหมายถึงอะไรในการโฮสต์มันหรือทำไม / เมื่อมันจำเป็น (หรือว่าเป็นไปได้ที่จะหลีกเลี่ยงได้ถ้าไม่จำเป็น) แม้แต่การสนทนาของเรย์มอนด์เฉินในเรื่องนั้นก็ทำให้เกิดความสับสนว่าทำไมแอปคอนโซลจึงโฮสต์แตกต่างกันเลย
สิ่งที่ใกล้เคียงที่สุดที่ฉันสามารถค้นหารายละเอียดคำอธิบายทางเทคนิคคือโพสต์บล็อกของ Microsoftซึ่งดูเหมือนจะเสริมความคิดว่ามันเป็นเพียงเกี่ยวกับ GUI และหน้าต่างของแอปคอนโซล สิ่งนี้ทำให้ฉันสงสัยยิ่งขึ้นว่าconhost.exeจำเป็นสำหรับโปรแกรมแบบไม่มีหน้าต่างเช่นเซิร์ฟเวอร์เหล่านี้หรือไม่ หากไม่มีหน้าต่างเลยทำไมฉันต้องเสียทรัพยากรและถ่วงพื้นที่กระบวนการด้วยกระบวนการที่ไม่จำเป็น? เหตุใด Windows จึงตรวจไม่พบเมื่อไม่จำเป็นและหลีกเลี่ยง การตอบสนองของ SecurityMatt นั้นก็มีประโยชน์เล็กน้อยในส่วนที่เกี่ยวกับคำอธิบายทางเทคนิค แต่อีกครั้งไม่เพียงพอของข้อมูลที่ฉันกำลังมองหา
conhostฉันไม่ได้เป็นเพียงคนเดียวที่ได้พยายามคิดหาวิธีที่จะหยุดกรณีที่ไม่จำเป็นของ บุคคลนี้ถามเกี่ยวกับการปิดการใช้งานและได้รับการบอกเพียง“ มันเป็นไปไม่ได้” โดยไม่มีความพยายามหรือความคิดเพิ่มเติมเกี่ยวกับมัน Hugh Dและ“ แทบจะไม่มีฟีเจอร์”ชี้ให้เห็นปัญหาด้วยอินสแตนซ์ที่ซ้ำซ้อนจำนวนมากconhost(อย่างน้อยก็csrssมีเพียงหนึ่งสำเนาที่ทำงานอยู่) รวมถึงการใช้ทรัพยากรและอินสแตนซ์ที่เอ้อระเหยหลังจากกระบวนการลูกของพวกเขาได้สิ้นสุดลงแล้ว ฉัน Lauferถามว่า / จำเป็นหรือไม่
การสังเกตและการพยายามแก้ไขปัญหา
หากพวกเขาไม่จำเป็นจริง ๆ ตลอดเวลา (อีกครั้งฉันไม่เคยเห็นผลร้ายใด ๆ จากการฆ่าพวกเขา) จากนั้นฉันคิดว่าฉันสามารถ (อย่างรำคาญ) แก้ปัญหาโดยการแทนที่เซิร์ฟเวอร์ด้วยชุดไฟล์ที่ทำงานเซิร์ฟเวอร์ รอแล้วฆ่าสำเนาของconhostสิ่งที่พวกเขาทำให้เกิดการเรียกใช้ แน่นอนว่าสิ่งนี้ต้องการวิธีที่รวดเร็วและง่ายดายในการพิจารณาว่าเป็นแบบใด FallenGameRถามวิธีรับอินสแตนซ์ของการconhost.exeเชื่อมโยงกับโปรแกรมคอนโซลของ PID ที่ระบุ แต่ไม่ได้รับคำตอบ ฉันคิดว่าการดึงข้อมูล PID ของกระบวนการหลักควรทำเคล็ดลับ (ไม่ใช่ ProcessExplorer ไม่ใช่ตัวเลือกอัตโนมัติ / scriptableจำเป็นต้องมีวิธีแก้ปัญหา) แต่ไม่เพียง แต่จะต้องสร้างกรอบบางอย่างเพื่อรับ PID ของเด็ก (แทนที่จะเรียกใช้เพียงแค่ทำงานกับงาน) แต่มันก็หมายถึงการหาวิธีที่จะทำให้มันเข้ากันได้ ด้วย XP เช่นกัน (เช่นการตรวจสอบชื่อภาพของกระบวนการหลัก) โพสต์บล็อกนี้ให้วิธีการเดียว แต่ต้องใช้ PowerShell และแทบจะไม่เหมาะเลยไม่ต้องพูดถึงมันไม่ได้เกี่ยวกับความแตกต่างของการเรียกใช้สคริปต์
คำถาม (s)
บางทีไมโครซอฟท์คิดว่าไม่มีใครใช้พรอมต์คำสั่งอีกต่อไป (* ไอ * Windows 8 * ไอ *) และสันนิษฐานว่ามันไม่ใช่เรื่องใหญ่สำหรับพวกเขา แต่มีสถานการณ์ที่แน่นอนที่มีแอพคอนโซลหลายตัวทำงานอยู่ วางไข่กระบวนการที่ใช้หน่วยความจำมากขึ้นการใช้ PID แย่มากและการพยายามหลีกเลี่ยงมันเป็นสิ่งที่ดีที่สุดไม่สะดวกอย่างน่ากลัว
ใครบ้างมีข้อมูลที่ชัดเจนและเชื่อถือได้ในเรื่องนี้? อีกครั้งฉันได้อ่านคำอธิบายทั่วไปแล้ว ฉันสงสัย:
- ทำไมแอปพลิเคชันคอนโซลต้อง (ยังคง) ได้รับการจัดการแตกต่างกันเลย
- ภายใต้สถานการณ์ที่เฉพาะที่พวกเขาต้องการที่จะมี
conhost - สิ่งที่ตามมาคือการฆ่า
conhost - หากมีวิธีใดที่จะหยุด / ป้องกัน / ปิดการใช้งาน / ปิดกั้นหรืออย่างน้อยก็เป็นวิธีที่ง่ายต่อการจัดการกับมันได้อย่างรวดเร็ว?
conhost.exeมันเทียบเท่ากับ PTY ของ Windows และcmd.exeเป็นเชลล์
conshost.exeยังคงวางไข่