2

Windows Server 2003 マシンで実行中のプロセスとそのファイル パスのリストを取得しようとしています。私はそれを試みるために次のコードを使用しています:

protected Map<String,String> getProcesses() {
    Map<String,String> processes = new HashMap<String,String>();
    try {
        String line;
        Process p = null;

        // Windows
        if (OS.indexOf("win") >= 0) {
            p = Runtime.getRuntime().exec("wmic process get description,executablepath");
            BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
            LOG.info("Entering while loop");
            while ((line = input.readLine()) != null) {
                LOG.info("blah");
                String[] array = line.split("\\s+");
                if (array.length > 1) {
                    processes.put(array[0], array[1]);
                }
            }
            LOG.info("Exited while loop");
            input.close();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return processes;
}

while 条件でプログラムが無限ループに陥ります。「何とか」と「Exited while loop」はログに出力されません。win7ローカルマシンとサーバーの両方でコマンドプロンプトでコマンドを実行し、情報を正常に出力しました。また、ローカル マシンで上記のコードを実行しましたが、これも正常に動作します。Java と Windows Server 2003 の間の問題のようですが、過去 3 時間のグーグル検索では見つけられませんでした。どんな助けでも大歓迎です。

4

2 に答える 2

10

OutputStreamを取得して使用する前に、を取得して閉じる必要がありますInputStream。これにより、開始したプロセスに対して、プロセスへの入力 (この場合は入力なし) の送信が完了したことが確認されます。

p.getOutputStream().close();

Processオブジェクトでは、入力getInputStream()はプロセスの出力ストリームから来て、出力はプロセスgetOutputStream()の入力ストリームに行くことに注意してください。

于 2012-11-13T19:49:22.967 に答える
2

BufferedReader.readLine()入力の最後に達していない場合、操作はブロックされることに注意してください。 こちら を参照してください

あなたが経験していることはAPIで説明されていると思いますProcess

プロセスを作成する方法は、ネイティブ ウィンドウ プロセス、デーモン プロセス、Microsoft Windows の Win16/DOS プロセス、シェル スクリプトなど、特定のネイティブ プラットフォームの特殊なプロセスではうまく機能しない場合があります。作成されたサブプロセスには、独自の端末またはコンソールがありません。すべての標準 io (つまり、stdin、stdout、stderr) 操作は、3 つのストリーム (getOutputStream()、getInputStream()、getErrorStream()) を介して親プロセスにリダイレクトされます。親プロセスは、これらのストリームを使用して、サブプロセスに入力をフィードし、サブプロセスから出力を取得します。一部のネイティブ プラットフォームでは、標準の入力ストリームと出力ストリームに対して限られたバッファー サイズしか提供されないため、サブプロセスの入力ストリームの書き込みまたは出力ストリームの読み取りが迅速に行われないと、サブプロセスがブロックされたり、デッドロックが発生したりする可能性があります。

于 2012-11-13T19:53:46.190 に答える