如何以编程方式知道Runtime.exec()进程何时被卡住?

时间:2016-09-01 07:04:05

标签: java runtime.exec

我在unix服务器中使用Process执行一些pl / sql文件。以下是代码

String line;
Process p = null;

p = Runtime.getRuntime().exec("sqlplus -s " + USER + "/" + PASS + "@" + sid + " @" + sqlTempDirectory);

BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
        if (line.contains("invalid username/password")) {
            System.out.println(sql.getName() + " file creation skipped as invalid username/password");
            p.destroy();
            break;
        }
}
input.close();

问题:由于用户名/密码无效,文件未找到或可能是某些未知异常,此java.lang.Process有时会被攻击。现在,基于输入流数据,我是捕获异常并使用p.destroy().销毁进程但是这只包括我所知道的异常,而不是可能发生的任何其他异常。

问题:我如何确定流程是否已被删除?如果它被击中,那么我想要销毁java.lang.Process

编辑检查线程的活动可能不是解决方案,因为在我的情况下我正在连接到数据库。因此,如果设置的连接可能需要一些时间,则进程可能会等待数据库连接并恢复。我在实时服务器实例中运行代码,因此可以进行等待。这并不能证明这个过程已经死了。我想确定该进程何时陷入僵局,并且将来不会再恢复。

编辑2:我不想杀死整个java程序执行。我只想破坏那个特定的java.lang.Process。所以解决方案必须是一些java代码,它会破坏java.lang.Process并继续执行程序的其余部分。

编辑3:问题不重复,因为我需要Java方式。获得线程转储无济于事。我只想破坏java.lang.Process ,而不是完整的java程序执行。

主要问题:我什么时候应该杀死我的进程。

不是如何,但是何时。我不想应用超时,因为我将在某个实时实例中运行该程序,并且可能还有许多其他外部原因导致进程卡住并且进程可能有机会恢复。但如果异常,该过程将不会恢复。我想处理那些场景。 输入流是空的,所以不知道是否发生错误。

1 个答案:

答案 0 :(得分:0)

你的意思是卡住吗?通过像jconsole这样的jvm监视工具可以观察到卡住的线程。如果你想根据一些异常和/或运行时错误停止os进程,你可以简单地将你的代码包装在catch块中

try {
        //process initiation
    } catch (Exception e) {
        //attempt process stop
    }catch(Error ex){
        //attempt process stop
    }

启动操作系统进程高度依赖于系统。如果你想要尝试停止os进程,如果它花费的时间比你预期的要长,你可以在一个你可以指定超时的线程中启动进程。