gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:17:11 29 4
gpt4 key购买 nike

我正在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

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

编辑2:我不想终止整个java程序的执行。我只想销毁那个特定的java.lang.Process。因此,解决方案必须是一些 java 代码,它将破坏 java.lang.Process 并继续执行程序的其余部分。

编辑3:这个问题不重复,因为我需要一种Java方式。获取线程转储不会有帮助。我只是想销毁java.lang.Process,而不是完整的java程序执行。

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

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

最佳答案

你的意思是卡住了吗?通过 jconsole 等 jvm 监控工具可以观察到卡住的线程。如果您想根据某些异常和/或运行时错误停止操作系统进程,您可以简单地将代码包装在 catch block 中

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

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

关于java - 如何以编程方式知道 Runtime.exec() 进程何时卡住?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39264746/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com