(เมื่อ) 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.