Java 如何通过编程知道Runtime.exec()进程何时被卡住?

Java 如何通过编程知道Runtime.exec()进程何时被卡住?,java,runtime.exec,Java,Runtime.exec,我正在unix服务器中使用进程执行一些pl/sql文件。下面是代码 String line; Process p = null; p = Runtime.getRuntime().exec("sqlplus -s " + USER + "/" + PASS + "@" + sid + " @" + sqlTempDirectory); BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStrea

我正在unix服务器中使用
进程执行一些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程序执行

主要问题:我应该在什么时候终止进程。

不是如何,而是何时。我不想应用超时,因为我将在某个实时实例中运行该程序,并且可能有许多其他外部原因导致进程停滞,进程可能有机会恢复。但在例外情况下,该过程不会恢复。我想处理这些情况。
输入流是空的,所以不知道是否发生了错误。

您的意思是卡住了吗?通过jconsole等jvm监视工具可以观察到卡住的线程。如果您想基于某些异常和/或运行时错误停止操作系统进程,只需将代码包装在catch块中即可

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

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

您的意思是卡住吗?通过jconsole等jvm监视工具可以观察到卡住的线程。如果您想基于某些异常和/或运行时错误停止操作系统进程,只需将代码包装在catch块中即可

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

启动操作系统进程高度依赖于系统。如果您想尝试停止操作系统进程(如果所用时间超出预期),可以在指定超时的线程中启动该进程。

有关正确创建和处理进程的许多好提示,请参阅。然后忽略它引用
exec
,并使用
ProcessBuilder
创建流程。还可以将
字符串arg
分解为
字符串[]args
,以说明包含空格字符的路径之类的问题。@DannyChen它不能回答我的问题。我有单独的sql文件。因此,保持对该线程的检查以查看活动可能没有帮助。可能是进程正在等待数据库连接,可能会在某个时间后恢复。因此,基于时间终止进程并不是解决方案。我想确定进程是死锁的,不会进一步执行。这里没有死锁的迹象。不要误用标准术语。@EJP好的,很抱歉造成混淆。。。但这个问题仍然没有得到回答,我如何知道这个过程是否会产生某种结果,或者在提到异常的情况下保持原状。我面临这个问题,因为在执行这个过程后,几个小时内什么都没有发生。甚至输入流也是空的。我不想应用超时,因为我将在某个活动实例中运行程序,并且可能有许多其他外部原因导致进程停滞,进程可能有机会恢复。但在例外情况下,该过程不会恢复。我想处理这些scenarios@HarshitaSethi从理论的角度来看,确定任意给定程序是否会结束的问题称为“停止问题”,事实证明,没有算法可以决定这一点。我知道你的特例只有你知道问题的目的是什么,你是否可以检查它是否有任何进展,因此只有你才能知道是否有办法判断程序是否卡住。有关正确创建和处理流程的许多好提示,请参阅。然后忽略它引用
exec
,并使用
ProcessBuilder
创建流程。还可以将
字符串arg
分解为
字符串[]args
,以说明包含空格字符的路径之类的问题。@DannyChen它不能回答我的问题。我有单独的sql文件。因此,保持对该线程的检查以查看活动可能没有帮助。可能是进程正在等待数据库连接,可能会在某个时间后恢复。因此,基于时间终止进程并不是解决方案。我想确定进程是死锁的,不会进一步执行。这里没有死锁的迹象。不要误用标准术语。@EJP好的,很抱歉造成混淆。。。但这个问题仍然没有得到回答,我如何知道这个过程是否会产生某种结果,或者在提到异常的情况下保持原状。我面临这个问题,因为在执行这个过程后,几个小时内什么都没有发生。甚至输入流也是空的。我不想应用超时,因为我将在某个实时实例中运行该程序,并且可能有许多其他外部原因导致进程停滞和