我在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程序执行。
主要问题:什么时候应该杀死我的进程。
不怎么样,但是当。我不想应用超时,因为我将在某个实例中运行该程序,并且可能有很多其他外部原因导致进程停滞不前,并且该进程可能有机会恢复。但是如果发生异常,过程将不会恢复。我想处理这些情况。 输入流是空的,所以不知道错误是否发生。
另请参阅[当Runtime.exec()不会](http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html)for许多关于正确创建和处理流程的好建议。然后忽略它是指'exec'并使用'ProcessBuilder'来创建进程。还要将'String arg'分解为'String [] args'来解释包含空格字符的路径。 –
@DannyChen它不回答我的问题。我有特定的SQL文件。因此,检查该线程以查看活动可能没有帮助。可能是进程正在等待数据库连接,并可能在某个时间后恢复。所以基于时间来杀死一个进程并不是一个解决方案。我想确定这个过程是死锁并不会进一步执行。 –
这里没有证据表明存在僵局。不要滥用标准术语。 – EJP