gpt4 book ai didi

java - 如果进程以退出代码 0 结束,我应该调用 Process.destroy() 吗?

转载 作者:行者123 更新时间:2023-12-05 07:50:01 26 4
gpt4 key购买 nike

我有一个通过 Spring JMSListener 启动的进程。该过程基本上运行一个运行时 exe 来调用 imagemagick 对图像进行一些再处理。在 *nix 下,即使 Runtime exec 命令以退出代码 0 退出且未抛出任何异常,仍有线程保留。该应用程序正在使用 Gythio Runtime Exec类来执行它的工作。尽管 Gythio 正确处理了运行时可能出现的围绕 StdErr 和 StdOut 的常见陷阱,但即使它成功了,我们难道不应该销毁该过程吗?

这是一个简单的例子,请忽略代码错误,它不是真正的代码。我的问题是围绕//process done block :

public class Test {

public void doSomething(String cmd, String processProperties, String processDirectory){

try {
// cmd is something like convert ... file .. params

Runtime runtime = Runtime.getRuntime();

final Process process = runtime.exec(cmd, processProperties, processDirectory);

int exitValue = process.waitFor();

System.out.println("exit value: " + exitValue);
BufferedReader buf = new BufferedReader(new InputStreamReader(
process.getInputStream()));
String line = "";
while ((line = buf.readLine()) != null) {
System.out.println("exec response: " + line);
//log = line;
//writeToFile(line);
}
// process is done... should it be destroyed?
if(process != null){
process.destroy();
}
// end process done
} catch (Exception e) {
System.out.println(e);
}
}
}

运行大约一个小时后,在 tomcat 中运行的应用程序显示这些线程(其中 tomcat 的 pid 1641):

[root@server logs]# top -H -p 1641
top - 19:45:24 up 264 days, 10:33,  4 users,  load average: 0.00, 0.00, 0.19
Tasks: 5068 total,   0 running, 5068 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.7%us,  1.5%sy,  0.0%ni, 97.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   8061332k total,  6690912k used,  1370420k free,   195348k buffers
Swap:  1888252k total,    77672k used,  1810580k free,  5070148k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
1734 adminuser  20   0 5842m 948m  13m S  0.3 12.0   3:03.41 java
1641 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:00.00 java
1643 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:01.20 java
1644 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:02.31 java
1671 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:02.28 java
1678 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:02.35 java
1686 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:02.20 java
1687 adminuser  20   0 5842m 948m  13m S  0.0 12.0   2:25.66 java
1688 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:00.11 java
1691 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:00.08 java
1706 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:00.00 java
1712 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:53.24 java
1720 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:39.38 java
1721 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:12.96 java
1722 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:00.00 java
1723 adminuser  20   0 5842m 948m  13m S  0.0 12.0   2:54.47 java
1724 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:00.00 java
1728 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:03.62 java
1729 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:08.16 java
1731 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:00.75 java
1732 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:02.58 java
1735 adminuser  20   0 5842m 948m  13m S  0.0 12.0   3:03.63 java
1736 adminuser  20   0 5842m 948m  13m S  0.0 12.0   3:02.23 java
1737 adminuser  20   0 5842m 948m  13m S  0.0 12.0   3:00.92 java
1738 adminuser  20   0 5842m 948m  13m S  0.0 12.0   3:03.59 java
1739 adminuser  20   0 5842m 948m  13m S  0.0 12.0   3:02.96 java
1740 adminuser  20   0 5842m 948m  13m S  0.0 12.0   3:05.07 java
1741 adminuser  20   0 5842m 948m  13m S  0.0 12.0   3:02.26 java
1742 adminuser  20   0 5842m 948m  13m S  0.0 12.0   3:04.57 java
1743 adminuser  20   0 5842m 948m  13m S  0.0 12.0   3:01.79 java
1744 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:26.27 java
1745 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:00.10 java
1746 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:10.72 java
1747 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:00.00 java
1748 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:10.99 java
5611 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:00.68 java
5620 adminuser  20   0 5842m 948m  13m S  0.0 12.0   0:00.36 java

感谢任何/所有回复!提前致谢!

最佳答案

我怀疑您的程序正在创建一个重要的输出。当您在后台运行程序时,它会写出可能只有几 KB 的缓冲区大小。一旦达到缓冲区大小,它就会等待消费者(您的程序)读取输出。这适用于标准输出和错误。

如果您不使用输出和错误,您生成的程序可能会永远等待,但您首先等待的是退出代码,而这不会发生,因此您会遇到死锁。

我建议你使用 ProcessBuilder ,将错误重定向到输出并在等待退出代码之前将两者都读到最后。

来自示例。

ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
pb.redirectErrorStream(true);
File log = new File("log");
pb.redirectOutput(Redirect.appendTo(log));
Process p = pb.start();
// no need to copy the output
int exit = p.waitFor();

关于java - 如果进程以退出代码 0 结束,我应该调用 Process.destroy() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36559284/

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