(เมื่อ) CONHOST.EXE จำเป็นจริงหรือไม่


23

พื้นหลัง

ปีที่แล้วฉันรวบรวมระบบบล็อก / เว็บเซิร์ฟเวอร์แบบพกพาที่ฉันสามารถเรียกใช้จากแฟลชไดรฟ์ มันยอดเยี่ยมมากและใช้งานได้ยอดเยี่ยมโดยเฉพาะใน 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 แย่มากและการพยายามหลีกเลี่ยงมันเป็นสิ่งที่ดีที่สุดไม่สะดวกอย่างน่ากลัว

ใครบ้างมีข้อมูลที่ชัดเจนและเชื่อถือได้ในเรื่องนี้? อีกครั้งฉันได้อ่านคำอธิบายทั่วไปแล้ว ฉันสงสัย:

  1. ทำไมแอปพลิเคชันคอนโซลต้อง (ยังคง) ได้รับการจัดการแตกต่างกันเลย
  2. ภายใต้สถานการณ์ที่เฉพาะที่พวกเขาต้องการที่จะมีconhost
  3. สิ่งที่ตามมาคือการฆ่าconhost
  4. หากมีวิธีใดที่จะหยุด / ป้องกัน / ปิดการใช้งาน / ปิดกั้นหรืออย่างน้อยก็เป็นวิธีที่ง่ายต่อการจัดการกับมันได้อย่างรวดเร็ว?

1
ก่อนที่ใครจะมารบกวนลิงก์ (หรือโหวตให้ใกล้เคียงกับของซ้ำฉันได้เห็นคำถามอื่น ๆ ที่นี่เช่น [อันนี้]) อย่างที่ฉันพูดการลากและวางไฟล์ไปที่แอพคอนโซลแบบไม่มีหน้าต่างนั้นไม่เกี่ยวข้องดังนั้นทำไมconshost.exeยังคงวางไข่
— Synetech

1
จากสิ่งที่ฉันอ่านส่วนหนึ่งของปัญหาคือ Windows ไม่ได้จัดการกับคอนโซลอย่างที่ * nix ทำ พวกเขาไม่ได้เป็นเพียงอุปกรณ์ตัวอักษรและไม่สามารถทำงานร่วมกันได้เลย (มีการสนทนาที่ดีเกี่ยวกับเรื่องนี้ภายใต้คำขอฟีเจอร์ PuTTY เพื่อสนับสนุนการใช้ PuTTY เป็นเทอร์มินัลคำสั่งในเครื่อง) ฉันคิดเสมอว่าconhost.exeมันเทียบเท่ากับ PTY ของ Windows และcmd.exeเป็นเชลล์
— Darth Android


@ techie007 ว่าเป็นหน้าเว็บที่ผม (พยายาม) การเชื่อมโยงไปในความคิดเห็นของฉันข้างต้น
— Synetech

คำตอบ:


19
  1. แอปพลิเคชั่นของคอนโซลจะต้องได้รับการจัดการที่แตกต่างกันเนื่องจากภายใต้เคอร์เนล NT (ซึ่งอยู่ภายใต้ 2000, XP, Vista, Windows 7 และ Windows 8 ทั้งหมด) ซึ่งเป็นพลเมืองชั้นสอง ในสถาปัตยกรรมระบบ Unix ทุกกระบวนการที่เวลาสร้างมีอินพุตมาตรฐานเอาต์พุตและสตรีมข้อผิดพลาดที่เชื่อมต่อกับมัน เทอร์มินัล IO ใช้งานในแง่ของสตรีมเหล่านี้ (stdin มาจากคีย์บอร์ดและ stdout / stderr ไปที่เทอร์มินัล) และต้องใช้ความพยายามพิเศษในส่วนของกระบวนการที่ไม่ต้องการใช้สตรีมเหล่านั้นหรือมี อธิบายไฟล์ของพวกเขาเปิด

    ในสถาปัตยกรรม Windows NT ซึ่งแม้ว่าจะไม่ได้สืบทอดสายงานของ VMS ได้รับการพัฒนาโดยทีมเดียวกันมากกว่าหรือน้อยกว่า แต่สิ่งที่ตรงกันข้ามคือความจริง กระบวนการที่เพิ่งเกิดใหม่โดยค่าเริ่มต้นจะไม่มีสตรีม I / O เชื่อมต่ออยู่เลยและไม่มีแนวคิดเช่น "เทอร์มินัล" โปรแกรมที่ต้องการทำงานใน Unixy มากกว่าเล็กน้อยอาจร้องขอ (โดยการประกาศเวลาคอมไพล์) ที่ระบบสร้างขึ้นสำหรับหน้าต่างคอนโซลและสตรีมอินพุต / เอาต์พุตที่เชื่อมต่อกับมัน ระบบจะทำเช่นนั้น แต่ตั้งแต่ Windows ซึ่งแตกต่างจากระบบปฏิบัติการยูนิกซ์ไม่ได้ให้คุณขั้วฟรีเป็นจำนวนมากของความพยายามเพิ่มเติมเป็นสิ่งจำเป็นในการสร้างหนึ่งดังนั้นก่อนและตอนนี้csrss.execonhost.exe

    สำหรับความแตกต่างระหว่างทั้งสองลิงก์ "คุณสมบัติไม่ค่อยมี" ของคุณจะอธิบายได้อย่างเพียงพอ ในระยะสั้นมันมีอยู่เพื่อแก้ไขข้อบกพร่องด้านความปลอดภัยในการทำซ้ำก่อนหน้านี้ของคอนโซล recondite สูงของ Windows ซึ่งอนุญาตให้มีการเพิ่มระดับสิทธิ์ในเวอร์ชันของ NT ที่เก่ากว่า Windows 7 (Vista, FYI) ซึ่งไม่conhost.exeเหมาะสม สถานะเป็น Windows Millennium ของตระกูล NT)

  2. โปรแกรมใด ๆ ซึ่งต้องการเทียบเท่ายูนิกซ์ stdin / stdout / stderr conhost.exeต้องการคอนโซลจึงเป็นตัวอย่างของ ผู้ย้ายถิ่นฐานจาก Unix-land เช่น Apache, PHP, และคนอื่น ๆ จะต้องการกระแสข้อมูลเหล่านี้ดังนั้นระบบจะสร้างอินสแตนซ์ของconhost.exeพวกเขาโดยอัตโนมัติไม่ว่าพวกเขาจะแสดงหน้าต่างจริงหรือไม่ ในทางทฤษฎีมันจะเป็นไปได้ที่จะปรับเปลี่ยนแหล่งที่มาสำหรับเช่น Apache ดังกล่าวว่าไม่จำเป็นต้อง terminal, และรวบรวมเป็นโปรแกรม Windows GUI conhost.exeแทนของการประยุกต์ใช้คอนโซลเพื่อที่ระบบจะไม่รู้สึกถึงความจำเป็นที่จะวางไข่มัน สมมติว่าเป็นไปได้ในทางปฏิบัติดูเหมือนว่าไม่มีใครสนใจเพียงพอที่จะทำเช่นนั้น บางทีคุณอาจจะเป็นคนแรก

  3. การฆ่าให้conhost.exeจะปิดคอนโซล IO สำหรับกระบวนการใดก็ตามที่ทำงานภายใต้อินสแตนซ์นั้น คุณอาจจะไม่สนใจเกี่ยวกับว่าเป็นเพราะคุณกำลังจัดการกับกระบวนการเซิร์ฟเวอร์ที่ไม่ได้ทำอะไรที่น่าสนใจบนคอนโซล IO ลำธารอยู่แล้วดังนั้นอาจมีเหตุผลที่จะไม่ฆ่าพวกเขาconhost.exes หากมีข้อสงสัยฆ่าพวกเขาออกและดูว่ามันจะแบ่งอะไร

  4. ไม่มีทางที่จะป้องกัน Windows จากการเริ่มต้นconhost.exeโปรแกรมเมื่อเปิดใช้งานซึ่งร้องขอคอนโซล IO; วิธีเดียวที่จะทำได้คือการคอมไพล์ใหม่เพื่อที่ Windows จะไม่ถือว่าเป็นแอปพลิเคชันคอนโซล อย่างไรก็ตามถ้าสมมติว่าการฆ่าผู้ปกครองของกระบวนการเซิร์ฟเวอร์conhost.exeนั้นไม่ได้ทำให้ฟังก์ชั่นการทำงานลดลงในทางที่คุณสนใจคุณควรจะสามารถฆ่าพวกมันทั้งหมดในคราวเดียวด้วยการออกtaskkill /f /im conhost.exeคำสั่ง Run prompt หรือหน้าต่างคอนโซล หลังอาจจะตายและเกือบจะหยุดทำงานทันทีที่แม่ของมันconhost.exeถูกฆ่าตาย อีกครั้งหากมีข้อสงสัยฆ่าพวกเขาออกและดูว่ามันทำลายอะไร


5
ทั้งหมดที่กล่าวมาเซิร์ฟเวอร์สแต็คแบบพกพาบนแฟลชไดรฟ์ดูเหมือนไม่เคยใช้เวลาทำงานบนเครื่องใดก็ตามและ 22M นั้นประมาณ 1% ของ RAM เสริมของเครื่องต่ำสุดที่คุณสามารถซื้อได้ง่ายในวันนี้ มีปัญหามากพอที่จะคุ้มค่ากับเวลาและความพยายามนี้หรือไม่?
— 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 ฉันไม่รู้ว่ามันหมายถึงอะไร คุณกำลังพูดถึงรอบของ CPU หรือไม่ ถ้าเป็นเช่นนั้นเว็บเซิร์ฟเวอร์จะได้รับผลกระทบค่อนข้างมากหากไซต์ดังกล่าวได้รับความนิยมมากพอ (และถูกใช้งานแม้ว่าจะไม่ใช่ก็ตาม PHP บน Windows ไม่ได้ราคาถูก CPU อย่างแน่นอน) ถ้าคุณหมายถึงว่ามันใช้งานบ่อยแค่ไหนฉันปล่อยให้มันทำงานบนแล็ปท็อปตลอดสัปดาห์
— 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? คุณไม่ได้เรียกใช้เว็บเซิร์ฟเวอร์ส่วนตัวในเครื่องใหม่คุณรันบนระบบเก่าที่ไม่มีประโยชน์อย่างอื่น (ในปี 1997 เพื่อนคนหนึ่งบอกฉันว่าเขาใช้งานเว็บเซิร์ฟเวอร์ Linux ทั้งเก่าและน้อยที่สุด - ตามมาตรฐานในเวลานั้น - ระบบ) เนื่องจากมันพกพาได้จึงต้องสามารถเข้ากันได้มากที่สุด และมันก็ไม่ได้เป็นเพียงความทรงจำ ; สำหรับสิ่งหนึ่งมันยังก่อให้เกิดมลภาวะพื้นที่กระบวนการและตัวจัดการงานกลุ่ม
— Synetech

Vista, FYI, does not have conhost.exe, which is befitting of its status as the Windows Millennium of the NT family. นั่นเป็นเหตุผลที่ฉันวาง Vista ไว้ระหว่างcsrssกับconhost; มันเป็นขั้นตอนกลาง สำหรับ Windows ME ที่น่าสงสารอย่าพูดจาแย่ ๆ ฉันเพิ่งเล่นJewels of the Oracleอีกครั้งโดยใช้ใน XP ใน VMPlayer แต่เมื่อฉันพยายามเล่นJewels IIฉันไม่สามารถทำได้ มันจะไม่ทำงานใน XP หรือ 2000 มันทำงานใน 98 แต่ 98 มีการสนับสนุนวิดีโอเสียงใน VMPlayer และ VirtualBox ไม่ดี หลังจากผ่านไปหลายสิบครั้งฉันพบว่าการผสมผสานระหว่าง OS และ VM ที่ทำให้เกมทำงานได้อย่างถูกต้องคือ ME ใน VMPlayer
— Synetech

4
ตามลำดับ: เมื่อฉันได้ยิน "เซิร์ฟเวอร์แบบพกพาสแต็คในแฟลชไดรฟ์" ฉันคิดว่า "ผู้ใช้ไม่สามารถอุทิศกล่องและต้องการให้เคลื่อนย้ายระหว่างเครื่องได้อย่างง่ายดาย" เนื่องจากไม่มีเหตุผลอื่นที่ดีที่จะทำเช่นนั้น หากคุณจัดการกับค่าโสหุ้ย VM อยู่แล้วทำไมไม่เพียงเรียกใช้เว็บเซิร์ฟเวอร์สแต็กของคุณบน Linux VM ไม่มีconhost.exeทางนั้น และสำหรับ Windows ME ฉันต้องพยายามที่จะสนับสนุนมันเมื่อมันใหม่และคุณสามารถอ้างถึงมุมที่คลุมเครือและมุมที่คุณชอบโดยไม่ต้องพูดถึงความคิดเห็นของฉันเกี่ยวกับอาหารเช้าของสุนัขในระบบปฏิบัติการซึ่งฉันสามารถ badmouth ได้ตลอดทั้งวัน โดยไม่ต้องทำมันให้ยุติธรรม
— แอรอนมิลเลอร์

7

แอปพลิเคชันคอนโซลที่เริ่มต้นด้วยการDETACHED_PROCESSตั้งค่าสถานะจะได้รับคอนโซลหรือกระบวนการลูก conhost ปัญหาคือว่าการตั้งค่าสถานะไม่ได้ใช้กับหลานดังนั้นจะทำงานเฉพาะกับกระบวนการที่คุณเริ่มต้นโดยตรง (ถ้าคุณยังสามารถหาโปรแกรมอรรถประโยชน์ที่ช่วยให้คุณระบุการตั้งค่าสถานะนี้)

ตัวเลือกอื่นที่อาจใช้ได้คือถ้ากระบวนการคอนโซลเรียกใช้FreeConsole()ฟังก์ชัน แอ็พพลิเคชันเซิร์ฟเวอร์บางตัวสนับสนุนพารามิเตอร์ -d หรือ -detach แต่นี่อาจเป็นเรื่องธรรมดามากขึ้นในระบบ * nix ...


1
นั่นฟังดูยอดเยี่ยม ไม่มีหน้าใดที่กล่าวถึงconhostแต่การเชื่อมต่อนั้นค่อนข้างชัดเจน ฉันจะทำแบบทดสอบเพื่อดูว่ามันมีเอฟเฟกต์อะไรบ้าง
— Synetech

2

วิธีแก้ปัญหาด่วนที่อาจเหมาะกับคุณ เมื่อเชื่อมโยงแอปพลิเคชันของคุณเพิ่ม / ระบบย่อย: WINDOWS กับตัวเลือก คุณสามารถใช้ editbin.exe เพื่อแก้ไขไฟล์ปฏิบัติการที่มีอยู่

สิ่งนี้ป้องกันไม่ให้ windows วางไข่ conhost.exe สำหรับแอปพลิเคชันของคุณ


นั่นฟังดูดี แต่ฉันก็ลองแล้วก็ใช้ไม่ได้ ฉันใช้มันเพื่อเปลี่ยนระบบย่อยสำหรับmysqldแต่เมื่อฉันวิ่งมันก็ยังกลับกลายเป็นconhostตัวอย่าง
— Synetech

มันอาจจะเป็นไปได้ว่าstderrจะยังคงจำเป็นสำหรับการmysqldและจึงจะต้องconhost?
— David T. Macknet
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.