18

Linuxでは、java.lang.Processオブジェクト(実際に型指定されたjava.lang.UNIXProcess)でdestroy関数を実行すると、プロセスにSIGTERMシグナルが送信されますが、SIGKILLでそれを強制終了する方法はありますか?

4

4 に答える 4

15

純粋なJavaを使用していません。

最も簡単な代替方法は、コマンドを外部プロセスとして Runtime.exec()実行するために使用することです。kill -9 <pid>

残念ながら、PIDを入手するのはそれほど簡単ではありません。private int pidフィールドにアクセスするには、リフレクションブラックマジックを使用するか、psコマンドからの出力をいじくり回す必要があります。

更新-実際には、別の方法があります。実際の外部アプリケーションを実行する小さなユーティリティ(Cプログラム、シェルスクリプトなど)を作成します。子プロセスのPIDを記憶するようにユーティリティーをコーディングし、子プロセスをSIGKILLするSIGTERMのシグナル・ハンドラーをセットアップします。

于 2010-06-01T14:09:37.037 に答える
11

スティーブンの答えは正しいです。私は彼が言ったことを書いた:

public static int getUnixPID(Process process) throws Exception
{
    System.out.println(process.getClass().getName());
    if (process.getClass().getName().equals("java.lang.UNIXProcess"))
    {
        Class cl = process.getClass();
        Field field = cl.getDeclaredField("pid");
        field.setAccessible(true);
        Object pidObject = field.get(process);
        return (Integer) pidObject;
    } else
    {
        throw new IllegalArgumentException("Needs to be a UNIXProcess");
    }
}

public static int killUnixProcess(Process process) throws Exception
{
    int pid = getUnixPID(process);
    return Runtime.getRuntime().exec("kill " + pid).waitFor();
}

この方法でpidを取得することもできます。

public static int getPID() {
  String tmp = java.lang.management.ManagementFactory.getRuntimeMXBean().getName();
  tmp = tmp.split("@")[0];
  return Integer.valueOf(tmp);
}
于 2010-06-01T15:48:55.197 に答える
1

プロセス名がわかっている場合は、pkill

Runtime.getRuntime().exec("pkill firefox").waitFor();
于 2015-05-14T21:12:01.163 に答える
1

Java1.8以降

destroyForcibly()デフォルトでメソッドを呼び出すメソッドを呼び出すことができますが、Javaドキュメントによると、このメソッドによって返される、またはこのメソッドを実装destroy()するすべてのサブプロセスがあります。ProcessBuilderRuntime.exec()

于 2015-07-22T17:35:52.697 に答える