(いつ)CONHOST.EXEは実際に必要ですか?


23

バックグラウンド

昨年、フラッシュドライブから実行できるポータブルなブログ/ Webサーバーシステムをコンパイルしました。それは素晴らしく、特にXPで素晴らしい動作をします。問題は、Windows 7で実行すると、各コンソールプログラムが2つのプロセス、プロセス自体、およびのコピーを生成することconhost.exeです。

問題

ポータブルブログシステムの場合、サーバーコンポーネント(MySQL mysqld.exe、Apacheの2つのインスタンスhttpd.exe、VisualSVNの2つのインスタンスvisualsvnserver.exe、PHPの複数のインスタンスphp-cgi.exe)のそれぞれがのインスタンスを生成しますconhost.exe。この時点で(php-cgi.exeアクティブなコピーがないconhost.exeため、CPUサイクルがほとんどない状態で実行中のインスタンスが5つありますが、実際のプロセスが現在使用している80MBに加えて22MBのメモリを消費します)。

研究

Windows 7がリリースされた(と私はVistaのため、おそらくだと思う)ので、私は把握しようとしたいくつかの場面で持って、正確に様々な(新しい)ホストプロセス(例えば、どのような目的conhost.exedllhost.exe、およびtaskhost.exe)を行うかどうか、彼らは実際には必要です。私はそれらを殺そうとしましたが、コンソールウィンドウを使用するプログラムと使用しないプログラム(サーバーなど)の両方で、コンソールプログラムが引き続き機能することがわかりました。

私はすでにcsrss.exe⇨Windows Vista⇨conhost.exe全体に精通しており、同じ(ほぼ逐語的な)説明を何度も見ました。問題は、誰もが単に同じ説明をコピー&ペーストするだけで、それは役に立たないということです。それが言っているのは、XP-では「ホスト」または「実行」されるコンソールアプリケーションですcsrss.exeが、Windows 7ではconhost.exeセキュリティのために移行されたということです。セキュリティの側面は理にかなっていますが、それをホストすることの意味や、それがなぜ/いつ必要なのか(または、必要でない場合は回避できるかどうか)については何も述べていません。この問題に関するレイモンド・チェンの議論でさえ、なぜコンソールアプリがまったく異なってホストされているのかを説明しています。

詳細で技術的な説明に最も近いものは、Microsoftのブログ投稿です。これは、コンソールアプリのGUIとウィンドウに関するだけであるという考えを補強しているようです。これによりconhost.exe、これらのサーバーのようなウィンドウレスプログラムに必要なのかどうかがさらに気になります。ウィンドウがまったくない場合、リソースを浪費し、プロセス空間を不要なプロセスで混乱させる必要があるのはなぜですか?なぜ不要なのかをWindowsが検出して回避できないのはなぜですか?SecurityMattの応答は、技術的な説明に関しても少し役立ちましたが、探している情報が十分ではありませんでした。

の不要なインスタンスを停止する方法を見つけようとしたのは私だけではありませんconhostこの人はそれを無効にすることについて尋ね、それ以上の努力も考えもせずに単に「それは不可能です」と言われました。Hugh D「Hardly a feature」は、子プロセスが終了した後のリソースの使用や残留インスタンスなど、多数の冗長なインスタンスconhost(少なくともがcsrss1つのコピーのみ実行されていた)の問題を指摘しました。ラウファーは、それが必要かどうか、いつ必要なのかを問いかけました。

観察と解決策の試み

それらが常に実際に必要ではない場合(再び、それらを殺すことによる悪影響は見ていません)、サーバーを実行するバッチファイルでサーバーを置き換えることで(非常にいらいらして)問題を回避できると思います、待ってから、conhost実行させるコピーを強制終了します。もちろん、これには、どれであるかを迅速かつ簡単に判断する方法が必要です。FallenGameRconhost.exeは、特定のPIDのコンソールプログラムに関連付けられたのインスタンスを取得する方法を尋ねましたが、回答が得られませんでした。親プロセスのPIDを取得するだけでうまくいくと思います(いいえ、ProcessExplorerはオプションではなく、自動化/スクリプト化可能ですソリューションが必要です)が、それは(単に実行してタスクを完了するのではなく)子のPIDを取得するために何らかのフレームワークを作成する必要があるだけでなく、互換性を持たせる方法を見つけることも意味しますXPでも同様です(たとえば、親プロセスのイメージ名を確認します)。このブログ投稿には1つの方法がありますが、PowerShellが必要であり、スクリプトを実行することの影響については何も述べていないことは言うまでもありません。

質問

おそらくマイクロソフトは、コマンドプロンプト(*咳* Windows 8 *咳*)をもう使用しないと考えているため、負担をかけることは大したことではないと考えていますが、複数のコンソールアプリが実行され、それぞれがすべてのシナリオを持っていることは間違いありません余分な、メモリを消費する、PIDを使用するプロセスを作成するのはひどく、それを回避しようとすると、せいぜいひどく不便です。

誰もが問題について決定的で信頼できる情報を持っていますか?繰り返しますが、私はすでに一般的な説明を読みました。不思議なんだけど:

  1. コンソールアプリケーションを(まだ)まったく異なる方法で処理する必要がある理由
  2. どのような特定の状況で彼ら持っている必要があるかconhost
  3. 殺害の結果は何ですかconhost
  4. それを停止/防止/無効化/ブロックする方法、または少なくとも後部でそれを迅速に処理する簡単な方法がありますか?

1
誰かがそれにリンクすることを気にする前に(または、それの複製としてクローズすることを投票する前に、私はすでに[this one]のような他の質問を見ました)。先ほど言ったように、ファイルをウィンドウレスコンソールアプリにドラッグアンドドロップすることは関係ないので、なぜconshost.exeまだ生成されているのでしょうか。
Synetech

1
私が読んだことから、問題の一部は、Windowsが* nixのようにコンソールを処理しないことです。これらは単なるキャラクターデバイスではなく、相互運用性もまったくありません(PuTTYをローカルコマンド端末として使用することをサポートするためのPuTTY機能要求の下で、これについて非常に良い議論があります)。私はそれconhost.exeがWindowsのPTYと同等でありcmd.exe、シェルであると常に考えていました。
ダースAndroid


@ techie007、それは私が上記のコメントでリンクしようとしたページです。
Synetech

回答:


19
  1. コンソールアプリケーションは、NTカーネル(2000、XP、Vista、Windows 7、およびWindows 8のすべての下にある)の下では二流の市民であるため、異なる方法で処理する必要があります。Unixシステムアーキテクチャでは、作成時のすべてのプロセスに標準入力、出力、およびエラーストリームが接続されています。端末IOはこれらのストリーム(キーボードから来るstdin、および端末に行くstdout / stderr)の観点から実装されており、これらのストリームを利用したくない、またはファイル記述子が開きます。

    Windows NTアーキテクチャでは、VMSの直系の子孫は多かれ少なかれ同じチームによって開発されましたが、反対は真実です。デフォルトで新たに生成されたプロセスには、I / Oストリームがまったく接続されておらず、「ターミナル」などの概念はありません。少しUnix風に振る舞うことを望むプログラムは、システムにコンソールウィンドウとそれに接続された入出力ストリームを作成することを(コンパイル時宣言によって)要求するかもしれません。システムがそうだろうが、Windows以来、Unixのとは違って、あなたの自由のための端子を与えるものではありません、追加の努力のかなりの量は、このように、以前は、1を作成する必要がありcsrss.exe、そして今conhost.exe

    この2つの違いについては、「機能が非常に難しい」リンクで十分に説明されています。要するに、それはNTのバージョンに権限昇格のために許可されたWindowsの非常に難解コンソールAPIの以前の反復におけるセキュリティ上の欠陥を回避するには存在する古いWindows 7(Vistaより、FYI、持っていないconhost.exeのにふさわしいされ、そのNTファミリーのWindows Millenniumとしてのステータス。)

  2. Unix stdin / stdout / stderrと同等のものを必要とするプログラムには、コンソールが必要であるため、のインスタンスが必要ですconhost.exe。Apache、PHPなどのUnixランドからの移民は、これらのストリームを必要とするため、conhost.exe実際にウィンドウを表示するかどうかにかかわらず、システムの自動インスタンス化が必要になります。理論的には、端末を必要としないようにApacheなどのソースを変更し、コンソールアプリケーションではなくWindows GUIアプリケーションとしてコンパイルして、システムがそれを生成する必要を感じないようにすることが可能conhost.exeです。実際にそれが可能であると仮定すると、誰もそうするほど気にかけていなかったようです。おそらくあなたが最初になるでしょう。

  3. 特定のconhost.exeインスタンスを強制終了すると、そのインスタンスで実行されているプロセスのコンソールIOがほぼ確実に無効になります。とにかくコンソールIOストリームで何も面白いことをしていないサーバープロセスを扱っているので、あなたはおそらくそれを気にしないでしょう。したがって、おそらくそれらを殺さない理由はないでしょうconhost.exe。疑わしい場合は、それらを殺し、それが何かを壊すかどうかを確認します。

  4. conhost.exeコンソールIOを要求するプログラムが起動されたときに、Windowsがインスタンス化するのを防ぐ方法はありません。これを行う唯一の方法は、Windowsがコンソールアプリケーションと見なさないように再コンパイルすることです。ただし、特定のサーバープロセスの親conhost.exeを強制終了しても、どのような方法でも機能が損なわれないと仮定するtaskkill /f /im conhost.exeと、Runプロンプトまたはコンソールウィンドウ(できれば前者)を発行することで、それらを一度に強制終了できます。後者はおそらく死亡し、その親conhost.exeインスタンスが殺されるとすぐに、ほぼ確実に機能しなくなります。繰り返しますが、疑わしい場合は、それらを殺して、それが何かを壊すかどうかを確認してください。


5
とは言っても、フラッシュドライブ上のポータブルサーバースタックは、特定のマシンで実行するのにそれほど時間を費やすことはないように聞こえます。これだけの時間と労力に見合うだけの問題は本当に十分なのでしょうか?
アーロンミラー

All that said, a portable server stack on a Flash drive sounds like it never spends much time running on any given machine これが何を意味するのか分かりません。CPUサイクルについて話しているのですか?もしそうなら、そのサイトが十分に人気がある場合、ウェブサーバーはかなり打撃を受ける可能性があります(そして、たとえそうでなくても打撃を受けます; Windows上のPHPは正確にCPUが安くありません)。一般的にどのくらいの頻度で実行されるのかというと、1週間ずっとラップトップで実行したままにしておきます。
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? 新しいマシンでパーソナルWebサーバーを実行するのではなく、他の用途には役に立たない古いシステムで実行します。(1997年に、友人は、当時の標準では、古くて最小のシステムでLinux Webサーバーを実行していると言っていました。)ポータブルであるため、可能な限り互換性がなければなりません。そして、それは単なる記憶ではありません。ひとつには、プロセス空間を汚染し、タスクマネージャーを混乱させます。
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については、口にしないでください。最近、OracleのJewelsを VMPlayerのXPで実行して再生しましたが、Jewels IIを再生しようとしてもできませんでした。XPまたは2000では実行されません。98で実行されますが、98はVMPlayerおよびVirtualBoxでのオーディオビデオのサポートが不十分です。数十回の試行の後、ゲームを正常に動作させるOSとVMの唯一の組み合わせがVMPlayerのMEであることがわかりました。
Synetech

4
順番:「フラッシュドライブ上のポータブルサーバースタック」と聞いたとき、「ユーザーはボックスを専用にすることができず、マシン間で簡単に移動できる必要がある」と思います。すでにVMのオーバーヘッドを処理している場合、Linux VM上でWebサーバースタックを実行するだけではどうですか?そんなconhost.exeことはありません。また、Windows MEについては、新しいときにサポートし直さなければならず、その犬のOSの朝食についての私の意見をぶちまけることなく、あなたが好きな曖昧で遅れたコーナーケースをすべて引用できます。正義を行わずに。
アーロンミラー

7

DETACHED_PROCESSフラグで開始されたコンソールアプリケーションは、コンソールもコンホストの子プロセスも取得しません。問題は、フラグが孫には適用されないため、直接起動するプロセスでのみ機能することです(このフラグを指定できるユーティリティが見つかった場合でも)。

動作する可能性のある他のオプションは、コンソールプロセスがFreeConsole()関数を呼び出す場合です。一部のサーバーアプリケーションは-dまたは-detachパラメーターをサポートしていますが、これはおそらく* nixシステムでより一般的です...


1
それは素晴らしいですね。これらのページには言及されていませんconhostが、接続はかなり明確に見えます。どんな効果があるかを確認するために、いくつかのテストを行います。
Synetech 14

2

あなたのために働くかもしれないクイックソリューション。アプリケーションをリンクするときに、/ SUBSYSTEM:WINDOWSをオプションに追加します。また、editbin.exeを使用して、既存の実行可能ファイルを変更することもできます。

これにより、Windowsがアプリケーションのconhost.exeを生成するのを防ぎます。


それは有望に思えたが、私はそれを試しただけでうまくいかなかった。私はそれを使用してのサブシステムを変更しmysqldましたが、それを実行すると、まだconhostインスタンスが生成されました。
Synetech

それstderrはまだ必要でmysqldあり、したがって必要conhostですか?
デビッドT.マックネット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.