(何时)确实需要CONHOST.EXE?
背景 去年,我编译了一个可移植的博客/网络服务器系统,该系统可以从闪存驱动器上运行。它很棒,而且效果很好,尤其是在XP上。问题在于,当它在Windows 7中运行时,每个控制台程序都会生成两个进程,该进程本身,以及的副本conhost.exe。 问题 对于便携式博客系统,其服务器组件的每个组件(MySQL的mysqld.exe,Apache的两个实例httpd.exe,VisualSVN的两个实例visualsvnserver.exe以及PHP的多个实例php-cgi.exe)都产生一个实例conhost.exe。目前(没有php-cgi.exe活动副本),我有五个conhost.exe正在运行的实例,几乎没有CPU周期用完,但是却消耗了22MB的内存(除了实际进程当前正在使用的80MB外)。 研究 由于Windows 7发布(我想可能是因为Vista的),我有几次试图弄清楚究竟什么样的目的不同(新)主机进程(例如conhost.exe,dllhost.exe和taskhost.exe),以及它们是否真的必要。我尝试杀死它们,发现控制台程序对于使用控制台窗口的程序和不使用控制台窗口的程序(例如服务器)都可以继续工作。 我已经对整个csrss.exe⇨Windows Vista⇨conhost.exe很熟悉,并且已经多次看到相同的解释(几乎逐字记录)。问题在于,每个人都只是复制粘贴相同的解释而没有帮助。它所说的只是在XP-控制台应用程序中“由...托管”或“在...下运行” csrss.exe,但在Windows 7中,它们被移至conhost.exe安全性考虑。安全方面是有道理的,但它没有说明托管它的含义或必要的理由/时间(或在没有必要的情况下是否有可能避免托管)。就连Raymond Chen 对此的讨论也掩盖了为什么控制台应用程序托管完全不同的原因。 我可以找到最接近详细的技术说明的内容是Microsoft博客文章,它似乎在强化这种想法,即仅涉及控制台应用程序的GUI和窗口。这使我更加想知道,conhost.exe对于像这些服务器这样的无窗口程序是否必要。如果根本没有窗口,那为什么我要浪费资源并用不必要的过程来使过程空间混乱?Windows为什么无法检测到何时不必要并避免它?关于技术说明,SecurityMatt的回复也很有用,但同样,我所寻找的信息不足。 我并不是唯一尝试找出一种方法来停止不必要的实例的人conhost。此人询问要禁用它,并被告知“不可能”,没有进一步的努力或思考。Hugh D和“难得的功能”指出了许多冗余实例的问题conhost(至少使用csrss,只有一个副本在运行),包括资源使用情况和子进程结束后的剩余实例。我劳弗(Laufer)质疑是否/何时需要。 观察和解决方案尝试 如果实际上并非始终都需要它们(再次,我没有看到杀死它们的任何不良影响),那么我想我可以(非常令人讨厌)通过用运行服务器的批处理文件替换服务器来解决该问题。 ,等待,然后杀死conhost它们导致运行的副本。当然,这需要一种快速简便的方法来确定它是哪一个。FallenGameR询问如何获取conhost.exe与给定PID的控制台程序相关联的实例,但没有得到答案。我认为,简单地获取父进程的PID应该可以解决问题(不,ProcessExplorer不是一种选择,它是自动/可编写的解决方案是必需的),但不仅需要创建某种框架来获取子代的PID(而不是简单地运行它并完成任务),而且还意味着需要找到一种使其兼容的方法以及XP(例如,检查父进程的映像名称)。这篇博客文章提供了一种方法,但是它需要PowerShell,并且并不是理想的选择,更不用说它对运行脚本的后果一无所知。 问题 也许微软认为没有人再使用命令提示符了(*咳嗽* Windows 8 *咳嗽*),因此假设负担不大,但是肯定有多个控制台应用程序正在运行并且每个都有一个的情况。产生一个额外的,消耗内存的,使用PID的过程是很糟糕的,而尝试解决这个问题,充其量是非常不便的。 有人对此事有权威的权威信息吗?同样,我已经阅读了通用说明;我想知道: 为什么控制台应用程序必须(仍然)以完全不同的方式处理 在什么样的具体情况,他们需要有conhost 杀戮的后果是什么conhost 是否有任何方法可以阻止/阻止/禁用/阻止它,或者至少有一种简单的方法可以迅速地对其进行处理?