如何清理由Runtime.exec()启动的进程?

5

当我的Java程序异常停止时,通过Runtime.exec()启动的应用程序不会停止。我该如何停止这些应用程序?

Process process = null;
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable()
{
     public void run() {
          process.destroy();
     }
}));

try
{
     process = Runtime.getRuntime().exec("win.exe");
     process.waitFor();
}
catch (Exception e)
{
     e.printStackTrace();
}
finally
{
    process.destroy();
}
2个回答

1

addShutdownHook不会在Java被强制关闭时执行,比如:

  • 从任务管理器中结束进程
  • 通过Eclipse的停止按钮结束进程
  • 在Linux上使用kill -9命令结束进程

只有在以下情况下它才会执行:

  • 按下Ctrl+c
  • 其他用户主动打断,例如Windows关机
  • 在Linux上使用kill命令结束进程

您可以通过将Java文件编译为class文件,然后在命令行上运行来测试此功能。运行命令后,您可以按下Ctrl+c以观察关闭挂钩的执行情况。

要进行测试,请按照下面所示创建RunTimeTest.java,然后使用您的JDK进行编译。

例如:

"c:\Program Files\Java\jdk1.7.0_40\bin"\javac RunTimeTest.java
"c:\Program Files\Java\jdk1.7.0_40\bin"\java RunTimeTest

测试代码:

import java.io.IOException;
import java.util.Arrays;

public class RunTimeTest {

    public static void main(String arguments[]) {
        ProcessBuilder processBuilder = new ProcessBuilder(Arrays.asList("notepad.exe"));

        Process process = null;
        try {
            process = processBuilder.start();
            final Process processToKill = process;
            Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("Shutdown Hook");
                    processToKill.destroy();
                }
            }));
            process.waitFor();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        } finally {
            if (process != null) {
                System.out.println("End of try");
                process.destroy();
            }
        }
    }
}

请看

查看 Runtime 的 Javadoc


0
最坏的情况是:如果你多次使用该程序,在下一次运行时你可以杀死该进程。
String command = "cmd /c taskkill /f /im win.exe";
Runtime.getRuntime().exec(command);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接