2016-09-01 50 views
1

我在unix服务器中使用Process执行一些pl/sql文件。下面是代码如何以编程方式知道Runtime.exec()进程何时卡住?

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有时会击中由于无效的用户名/密码,文件未找到或可能是某种未知的exception.Right现在,基于输入流数据我赶上使用p.destroy().的例外情况并销毁该进程但是,这只涵盖了我所知的异常,并没有发生任何其他异常。

问题:我怎么知道这个过程是否被触发?如果它被击中,那么我想破坏java.lang.Process

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

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

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

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

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

+1

另请参阅[当Runtime.exec()不会](http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html)for许多关于正确创建和处理流程的好建议。然后忽略它是指'exec'并使用'ProcessBuilder'来创建进程。还要将'String arg'分解为'String [] args'来解释包含空格字符的路径。 –

+0

@DannyChen它不回答我的问题。我有特定的SQL文件。因此,检查该线程以查看活动可能没有帮助。可能是进程正在等待数据库连接,并可能在某个时间后恢复。所以基于时间来杀死一个进程并不是一个解决方案。我想确定这个过程是死锁并不会进一步执行。 –

+0

这里没有证据表明存在僵局。不要滥用标准术语。 – EJP

回答

0

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

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

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

+0

卡住意味着我使用'Runtime.exec()'执行一个文件,并且它什么也不做。它由于某种原因被阻塞。原因对我来说是不可见的。没有例外,但是这个过程被封锁了,这是一个僵局。 –

+0

我更新了我的回复。 –

+0

@HarshitaSethi块不是死锁。这是一块。死锁是有两个进程和两个锁(或更多)的地方。这是一块。不要滥用标准术语。 – EJP

相关问题