(Khi nào) CONHOST.EXE thực sự cần thiết?


23

Lý lịch

Năm ngoái tôi đã biên soạn một hệ thống blog / máy chủ web di động mà tôi có thể chạy từ ổ đĩa flash. Thật tuyệt vời và hoạt động tuyệt vời, đặc biệt là trên XP. Vấn đề là khi nó chạy trong Windows 7, mỗi chương trình giao diện điều khiển sinh ra hai quá trình, chính quá trình đó, cộng với một bản sao conhost.exe.

Vấn đề

Trong trường hợp hệ thống blog di động, mỗi một trong các thành phần máy chủ của nó ( hai phiên bản của MySQL mysqld.exe, hai trường hợp của httpd.exeVisualSVN visualsvnserver.exevà nhiều phiên bản của PHP php-cgi.exe) sinh ra một thể hiện của conhost.exe. Tại thời điểm này (không có bản sao php-cgi.exehoạt động, tôi có năm phiên bản conhost.exeđang chạy, sử dụng bên cạnh không có chu kỳ CPU, nhưng tiêu thụ 22 MB bộ nhớ (ngoài 80 MB mà các quy trình thực tế hiện đang sử dụng).

Nghiên cứu

Kể từ khi Windows 7 được phát hành (và tôi nghĩ rằng có thể từ Vista), tôi có nhiều lần cố gắng để tìm ra chính xác những gì mục đích khác nhau quá trình (mới) máy chủ (ví dụ conhost.exe, dllhost.exetaskhost.exe) làm và cho dù họ là thực sự cần thiết. Tôi đã thử giết chúng và thấy rằng các chương trình giao diện điều khiển tiếp tục hoạt động, cả cho các chương trình sử dụng cửa sổ bàn điều khiển và những chương trình không (như máy chủ).

Tôi đã quen thuộc với toàn bộ csrss.exe⇨ Windows Vistaconhost.exe và đã thấy giải thích tương tự (gần như nguyên văn) nhiều lần. Vấn đề là tất cả mọi người chỉ đơn giản là sao chép-dán cùng một lời giải thích không hữu ích. Tất cả những gì nó nói là trong XP-, các ứng dụng bảng điều khiển trong đó các máy chủ lưu trữ được điều khiển bởi các máy chủ hay được điều hành bởi hệ thống điều khiển, hay csrss.exetrong Windows 7, nhưng trong Windows 7, chúng đã được chuyển sang conhost.exeđể bảo mật. Khía cạnh bảo mật có ý nghĩa, nhưng nó không nói gì về ý nghĩa của việc lưu trữ nó hoặc tại sao / khi cần thiết (hoặc liệu có thể tránh nó nếu không cần thiết). Ngay cả cuộc thảo luận của Raymond Chen về vấn đề này cũng giải thích tại sao các ứng dụng bảng điều khiển được lưu trữ khác nhau.

Điều gần nhất mà tôi có thể tìm thấy để giải thích chi tiết, kỹ thuật là một bài đăng trên blog của Microsoft dường như củng cố ý tưởng rằng đó chỉ là về GUI và cửa sổ của ứng dụng giao diện điều khiển. Điều này khiến tôi băn khoăn thậm chí còn khó hơn liệu conhost.execó cần thiết cho các chương trình không có cửa sổ như các máy chủ này không. Nếu không có cửa sổ nào cả, vậy tại sao tôi phải lãng phí tài nguyên và làm lộn xộn không gian quy trình với các quy trình không cần thiết? Tại sao Windows không thể phát hiện khi không cần thiết và tránh nó? Phản hồi của SecurityMatt cũng hơi hữu ích đối với một lời giải thích kỹ thuật, nhưng một lần nữa, không đủ thông tin tôi đang tìm kiếm.

Tôi không phải là người duy nhất đã cố gắng tìm ra cách để ngăn chặn những trường hợp không cần thiết conhost. Người này đã hỏi về việc vô hiệu hóa nó và được nói đơn giản là nó không thể thực hiện được mà không cần nỗ lực hay suy nghĩ gì thêm về nó. Hugh DHard Hầu như một tính năng, chỉ ra vấn đề với rất nhiều trường hợp dư thừa conhost(ít nhất là với csrss, chỉ có một bản sao duy nhất đang chạy), bao gồm cả việc sử dụng tài nguyên và các trường hợp kéo dài sau khi quá trình con của họ kết thúc. Tôi Laufer đặt câu hỏi liệu / khi nó cần thiết.

Quan sát và cố gắng giải pháp

Nếu chúng không thực sự cần thiết vào mọi lúc (một lần nữa, tôi đã không thấy bất kỳ ảnh hưởng xấu nào từ việc giết chúng), thì tôi cho rằng tôi có thể (rất khó chịu) giải quyết vấn đề bằng cách thay thế các máy chủ bằng các tệp bó chạy máy chủ , chờ đợi, và sau đó giết bản sao conhostmà chúng gây ra để chạy. Tất nhiên điều này đòi hỏi một cách nhanh chóng và dễ dàng để xác định đó là cái nào. FallenGameR đã hỏi làm thế nào để có được phiên bản conhost.exeliên kết với chương trình giao diện điều khiển của một PID nhất định nhưng không nhận được câu trả lời. Tôi nghĩ rằng chỉ cần truy xuất PID của tiến trình cha nên thực hiện thủ thuật (không, ProcessExplorer không phải là một tùy chọn, tự động / có thể tạo tập lệnhgiải pháp là bắt buộc), nhưng không chỉ yêu cầu tạo ra một số loại khung để có được PID của trẻ (thay vì chỉ đơn giản là chạy và thực hiện với nhiệm vụ), mà còn có nghĩa là tìm ra cách để làm cho nó tương thích với XP cũng vậy (ví dụ: kiểm tra tên hình ảnh của quá trình cha). Bài đăng trên blog này cung cấp một cách, nhưng nó yêu cầu PowerShell và hầu như không lý tưởng, chưa kể nó không nói gì về sự phân nhánh của việc chạy tập lệnh.

Câu hỏi

Có lẽ Microsoft cho rằng không ai sử dụng các lệnh nhắc nữa (* ho * Windows 8 * ho *) và vì vậy cho rằng đó không phải là vấn đề lớn để gây gánh nặng cho họ, nhưng chắc chắn có nhiều kịch bản trong đó nhiều ứng dụng bảng điều khiển đang chạy và có từng ứng dụng sinh ra một quá trình sử dụng thêm bộ nhớ, tiêu tốn bộ nhớ, là khủng khiếp và cố gắng làm việc xung quanh nó, tốt nhất là, bất tiện khủng khiếp.

Có ai có thông tin dứt khoát, có thẩm quyền về vấn đề này? Một lần nữa, tôi đã đọc lời giải thích chung chung; Tôi đang tự hỏi:

  1. Tại sao các ứng dụng bàn điều khiển phải (vẫn) được xử lý khác nhau
  2. Trong những trường hợp cụ thể họ cần phải cóconhost
  3. Những gì mà hậu quả là giết ngườiconhost
  4. Nếu có cách nào để ngăn chặn / ngăn chặn / vô hiệu hóa / chặn nó hoặc ít nhất là một cách dễ dàng để nhanh chóng xử lý vấn đề này?

1
Trước khi bất kỳ ai bận tâm liên kết đến nó (hoặc bỏ phiếu để đóng như một bản sao của nó, tôi đã thấy các câu hỏi khác ở đây như [câu hỏi này]). Như tôi đã nói, việc kéo và thả tệp vào ứng dụng bảng điều khiển không có cửa sổ là không liên quan, vậy tại sao conshost.exevẫn sinh sản?
Synetech

1
Từ những gì tôi đã đọc, một phần của vấn đề là Windows không xử lý các bảng điều khiển như * nix. Chúng không chỉ đơn giản là các thiết bị nhân vật và hoàn toàn không thể tương tác với nhau (Có một cuộc thảo luận rất tốt về vấn đề này theo yêu cầu tính năng PuTTY để hỗ trợ sử dụng PuTTY làm thiết bị đầu cuối lệnh cục bộ). Tôi đã luôn luôn nghĩ rằng đó conhost.exelà tương đương với PTY của Windows và cmd.exelà vỏ.
Darth Android


@ techie007, đó là trang mà tôi (đã cố gắng) liên kết đến trong nhận xét của tôi ở trên .
Synetech

Câu trả lời:


19
  1. Các ứng dụng bảng điều khiển phải được xử lý khác nhau vì trong nhân NT (làm nền tảng cho tất cả 2000, XP, Vista, Windows 7 và Windows 8), chúng là công dân hạng hai. Trong kiến ​​trúc hệ thống Unix, mọi quy trình tại thời điểm tạo đều có các luồng đầu vào, đầu ra và lỗi chuẩn được đính kèm; IO thiết bị đầu cuối được triển khai theo các luồng này (stdin đến từ bàn phím và stdout / stderr đi đến thiết bị đầu cuối) và cần có thêm nỗ lực trong quá trình không muốn sử dụng các luồng đó hoặc có mô tả tập tin của họ mở.

    Trong kiến ​​trúc Windows NT, trong khi không phải là hậu duệ của VMS được phát triển bởi ít nhiều cùng một nhóm, thì điều ngược lại là đúng; một quy trình mới được sinh ra theo mặc định không có luồng I / O nào được kết nối với nó và không có khái niệm nào như "thiết bị đầu cuối". Các chương trình muốn hành xử theo kiểu Unixy hơn một chút có thể yêu cầu (bằng cách khai báo thời gian biên dịch) mà hệ thống tạo cho chúng một cửa sổ giao diện điều khiển và các luồng đầu vào / đầu ra được kết nối với nó; hệ thống sẽ làm như vậy, nhưng vì Windows, không giống như Unix, không cung cấp cho bạn các thiết bị đầu cuối miễn phí, nên cần một lượng nỗ lực đáng kể để tạo một thiết bị, như trước đây csrss.exevà bây giờ conhost.exe.

    Đối với sự khác biệt giữa hai loại, liên kết "Hầu như là một tính năng" của bạn giải thích nó khá đầy đủ; Nói tóm lại, nó tồn tại để khắc phục lỗ hổng bảo mật trong lần lặp trước của API bảng điều khiển được phục hồi cao của Windows, cho phép leo thang đặc quyền trong các phiên bản NT cũ hơn Windows 7. (Vista, FYI, không có conhost.exe, phù hợp với nó trạng thái như thiên niên kỷ Windows của gia đình NT.)

  2. Bất kỳ chương trình nào muốn tương đương với Unix stdin / stdout / stderr đều cần một bàn điều khiển, do đó là một ví dụ conhost.exe. Những người nhập cư từ vùng đất Unix, như Apache, PHP và cộng sự, sẽ muốn những luồng này, do đó hệ thống sẽ tự động khởi tạo hệ thống conhost.execho họ, cho dù họ có thực sự hiển thị cửa sổ hay không. Về lý thuyết, có thể sửa đổi nguồn ví dụ như Apache sao cho không yêu cầu thiết bị đầu cuối và biên dịch nó dưới dạng ứng dụng GUI của Windows thay vì ứng dụng console, để hệ thống không cảm thấy cần phải sinh ra nó conhost.exe. Giả sử nó cũng có thể trong thực tế, dường như không ai quan tâm đủ để làm như vậy. Có lẽ bạn sẽ là người đầu tiên.

  3. Giết một cái nhất định conhost.exesẽ gần như chắc chắn vô hiệu hóa IO console cho bất kỳ quá trình nào đang chạy trong trường hợp đó. Bạn có thể không quan tâm đến điều đó bởi vì bạn đang xử lý các quy trình máy chủ không thực hiện bất kỳ điều gì thú vị trên các luồng IO của bảng điều khiển, vì vậy có lẽ không có lý do gì để không giết chết chúng conhost.exe. Nếu nghi ngờ, hãy tiêu diệt chúng và xem nó có phá vỡ gì không.

  4. Không có cách nào để ngăn Windows khởi tạo conhost.exekhi chương trình được khởi chạy yêu cầu bàn điều khiển IO; cách duy nhất để làm như vậy là biên dịch lại nó để Windows không coi nó là một ứng dụng console. Tuy nhiên, giả sử rằng việc giết cha mẹ của một quy trình máy chủ nhất định conhost.exekhông làm suy giảm chức năng của nó theo bất kỳ cách nào bạn quan tâm, bạn sẽ có thể giết tất cả chúng cùng một lúc bằng cách phát hành taskkill /f /im conhost.exetrong dấu nhắc Run hoặc cửa sổ giao diện điều khiển - tốt nhất là trước đây, vì cái sau có thể sẽ chết, và gần như chắc chắn sẽ ngừng hoạt động, ngay khi conhost.execá thể mẹ của nó bị giết. Một lần nữa, nếu nghi ngờ, giết chúng đi và xem nếu nó phá vỡ bất cứ điều gì.


5
Tất cả những gì đã nói, một ngăn xếp máy chủ di động trên ổ Flash nghe có vẻ như không bao giờ dành nhiều thời gian để chạy trên bất kỳ máy nào và 22M là khoảng 1% bổ sung RAM của máy cấp thấp nhất mà bạn có thể dễ dàng mua trong những ngày này. Có thực sự đủ của một vấn đề đáng giá nhiều thời gian và nỗ lực này?
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 Tôi không biết điều này có nghĩa là gì. Bạn đang nói về chu kỳ CPU? Nếu vậy, thì một máy chủ web có thể bị tấn công khá nhiều nếu trang web đủ phổ biến (và bị cấm ngay cả khi không phải vậy; PHP trên Windows không chính xác là CPU giá rẻ). Nếu bạn có nghĩa là nó thường chạy như thế nào, tôi sẽ để nó chạy trên máy tính xách tay của tôi suốt cả tuần.
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? Bạn không chạy máy chủ web cá nhân trên một máy mới, bạn chạy nó trên một hệ thống cũ không hữu ích cho nhiều người khác. (Vào năm 1997, một người bạn đã nói với tôi rằng anh ta đang điều hành một máy chủ web Linux trên một hệ thống tiêu chuẩn cũ và tối thiểu bởi hệ thống tiêu chuẩn của thời đó.) Kể từ khi có thể mang theo, nó phải có khả năng tương thích nhất có thể. Và đó không chỉ là ký ức ; đối với một điều, nó cũng gây ô nhiễm không gian xử lý và làm xáo trộn Trình quản lý tác vụ.
Synetech

Vista, FYI, does not have conhost.exe, which is befitting of its status as the Windows Millennium of the NT family. Đó là lý do tôi đặt Vista giữa csrssđể conhost; đó là một bước giữa Đối với Windows ME nghèo, đừng nói xấu nó. Gần đây tôi đã chơi lại Jewels of the Oracle bằng cách chạy nó trong XP trong VMPlayer, nhưng khi tôi thử chơi Jewels II , tôi không thể. Nó sẽ không chạy trong XP hoặc 2000. Nó chạy trong 98, nhưng 98 có hỗ trợ video âm thanh kém trong VMPlayer và VirtualBox. Sau hàng tá lần thử, tôi thấy rằng sự kết hợp duy nhất của OS & VM cho phép trò chơi hoạt động chính xác là ME trong VMPlayer.
Synetech

4
Theo thứ tự: Khi tôi nghe thấy "ngăn xếp máy chủ di động trên ổ Flash", tôi nghĩ rằng "người dùng không thể dành một hộp cho nó và cần nó dễ dàng di chuyển giữa các máy", bởi vì không có lý do chính đáng nào khác để làm theo cách đó. Nếu bạn đang xử lý VM trên đầu, tại sao không chạy stack máy chủ web của bạn trên Linux VM? Không có conhost.execách đó. Và đối với Windows ME, tôi đã phải cố gắng hỗ trợ nó khi nó còn mới và bạn có thể trích dẫn tất cả các trường hợp góc khuất, mơ hồ mà bạn thích mà không đưa ra ý kiến ​​của tôi về bữa sáng của con chó đó, mà tôi có thể nói xấu cả ngày mà không làm điều đó công lý.
Aaron Miller

7

Một ứng dụng giao diện điều khiển bắt đầu với DETACHED_PROCESScờ sẽ nhận được một giao diện điều khiển cũng như quá trình con chung. Vấn đề là cờ không áp dụng cho các cháu lớn nên nó sẽ chỉ hoạt động với các quy trình bạn bắt đầu trực tiếp (nếu bạn thậm chí có thể tìm thấy một tiện ích cho phép bạn chỉ định cờ này).

Tùy chọn khác có thể hoạt động là nếu quá trình điều khiển gọi FreeConsole()hàm. Một số ứng dụng máy chủ hỗ trợ tham số -d hoặc -detach nhưng điều này có lẽ phổ biến hơn trên các hệ thống * nix ...


1
Điều đó nghe thật tuyệt vời. Không có trang nào đề cập đến conhost, nhưng kết nối có vẻ khá rõ ràng. Tôi sẽ làm một số thử nghiệm để xem nó có loại hiệu ứng nào.
Synetech

2

Giải pháp nhanh chóng có thể làm việc cho bạn. Khi liên kết ứng dụng của bạn thêm / SUBSYSTEM: WINDOWS với các tùy chọn. Bạn cũng có thể sử dụng editbin.exe để sửa đổi một tệp thực thi hiện có.

Điều này ngăn các cửa sổ sinh ra một conhost.exe cho ứng dụng của bạn.


Điều đó nghe có vẻ hứa hẹn, nhưng tôi chỉ thử nó và nó không hoạt động. Tôi đã sử dụng nó để thay đổi hệ thống con mysqld, nhưng khi tôi chạy nó, nó vẫn sinh ra một conhostthể hiện.
Synetech

Có thể đó stderrvẫn là cần thiết cho mysqldvà, do đó, nó cần conhost?
David T. Macknet
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.