gpt4 book ai didi

java - 英特尔 MPI mpirun 不会使用 java Process.destroy() 终止

转载 作者:行者123 更新时间:2023-11-30 03:17:32 34 4
gpt4 key购买 nike

我的 Intel MPI 版本是安装在 RHEL 计算机上的 impi/5.0.2.044/intel64。

我使用 java 来调用 MPI 程序,代码如下:

ProcessBuilder builder = new ProcessBuilder();
builder.command("mpirun ./myProgram");
builder.redirectError(Redirect.to(new File("stderr")));
builder.redirectOutput(Redirect.to(new File("stdout")));
Process p = null;
try {
p = builder.start();
} catch (IOException e) {
e.printStackTrace();
}
// Process has started here
p.destroy();
try {
// i = 143
int i = p.exitValue();
} catch( IllegalThreadStateException e){
}

但即使在知道 exitValue() 且未引发异常的情况下,ps aux 仍然显示一堆 ./myProgram,并且程序仍在写入结果文件,就好像它没有被杀死一样,只有在完成所有计算后才终止。

目前,我发现成功终止./myProgram的唯一方法是在java程序的控制台中使用Ctrl+C终止java。

我的意图是立即停止计算并让java程序安排一些其他计算。是否有任何解决方法可以强制所有 mpi 实例终止,或者至少保证在短时间内终止(例如 30 秒或 1 分钟的轮询)?

最佳答案

问题在于 destroy 的 JDK 实现发送SIGTERM ,关闭mpirun难的。请参阅here获取相关的 JDK 源。

您需要发送SIGINT给 MPI 一个正常关闭的机会。

例如Runtime.getRuntime().exec("kill -9 <pid>");

您可以通过调用mpirun来获取PID与 --report-pid 。 (阅读手册页)

编辑

您也可以使用反射来找出您在类 UNIX 操作系统下启动的进程的 PID(从 here 窃取)。当我们谈论杀死和信号时,这不应该成为限制。

if(process.getClass().getName().equals("java.lang.UNIXProcess")) {
/* get the PID on unix/linux systems */
try {
Field f = process.getClass().getDeclaredField("pid");
f.setAccessible(true);
pid = f.getInt(p);
} catch (Throwable e) {
}
}

关于java - 英特尔 MPI mpirun 不会使用 java Process.destroy() 终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32222878/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com