Linuxでは、java.lang.Processオブジェクト(実際に型指定されたjava.lang.UNIXProcess)でdestroy関数を実行すると、プロセスにSIGTERMシグナルが送信されますが、SIGKILLでそれを強制終了する方法はありますか?
4 に答える
純粋なJavaを使用していません。
最も簡単な代替方法は、コマンドを外部プロセスとして Runtime.exec()
実行するために使用することです。kill -9 <pid>
残念ながら、PIDを入手するのはそれほど簡単ではありません。private int pid
フィールドにアクセスするには、リフレクションブラックマジックを使用するか、ps
コマンドからの出力をいじくり回す必要があります。
更新-実際には、別の方法があります。実際の外部アプリケーションを実行する小さなユーティリティ(Cプログラム、シェルスクリプトなど)を作成します。子プロセスのPIDを記憶するようにユーティリティーをコーディングし、子プロセスをSIGKILLするSIGTERMのシグナル・ハンドラーをセットアップします。
スティーブンの答えは正しいです。私は彼が言ったことを書いた:
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);
}
プロセス名がわかっている場合は、pkill
Runtime.getRuntime().exec("pkill firefox").waitFor();
Java1.8以降
destroyForcibly()
デフォルトでメソッドを呼び出すメソッドを呼び出すことができますが、Javaドキュメントによると、このメソッドによって返される、またはこのメソッドを実装destroy()
するすべてのサブプロセスがあります。ProcessBuilder
Runtime.exec()