0

Runtime.exec を使用してjstackコマンドを実行しようとしていますが、エラーがあるようですが、それを見つけることができません。さらに、CMD で次のコマンドを実行すると、正常に動作します。

C:\Users\bob>"C:\Program Files\Java\jdk1.6.0_18\bin\jstack" 5540 > d:\s.log

テスト クラスの全文:

package test;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Test {

    public static void main(String[] args) {
        try {
            Process process = Runtime.getRuntime().exec("\"C:\\Program Files\\Java\\jdk1.6.0_18\\bin\\jstack\" 5540 > d:\\s.log");
            BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line = "";
            while ((line = input.readLine()) != null) {
                System.out.println(line);
            }
            int exitVal = process.waitFor();
            System.out.println("Exited with code '" + exitVal + "'");
        } catch (Exception e) {
            System.out.println("Error.");
        }
    }
}

出力:

Usage:

    jstack [-l] <pid>

        (to connect to running process)

Options:

    -l  long listing. Prints additional information about locks

    -h or -help to print this help message

Exited with code '1'

どうすればこの問題を解決できますか?

前もって感謝します。

4

1 に答える 1

0

原因は出力リダイレクト引数です> d:\\s.log 。jstack は実際にそのビットを追加の引数として受け取り、解析に失敗してエラーを出力します。

クラス (Windows では cmd.exe) から同じコマンドを呼び出すと、シェル自体がリダイレクト コマンドを認識し、コマンドから削除し、jstack は pid 引数のみを「認識」します。

これを修正するには 2 つのオプションがあります。

  1. jstack.exe を呼び出さないでください。jstack を実行して出力をリダイレクトするように指示する引数を指定して cmd.exe を呼び出します。
  2. リダイレクトビットを削除し、出力を自分でファイルに書き込みます
于 2013-11-17T13:57:19.350 に答える