- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个通过 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/
我有两个类(class): parent 和 child child : belongs_to :parent 和 家长 has_many :children, :dependent => :dest
我有这个模型 class XmlImport ["text/xml"] end :event_import_records 条目正在被销毁。但是 :events 不是。 has_many throu
我定义了以下简单的管道: image: name: hashicorp/terraform:light entrypoint: - '/usr/bin/env' - 'PATH
我定义了以下简单的管道: image: name: hashicorp/terraform:light entrypoint: - '/usr/bin/env' - 'PATH
在我们的应用程序中,我们覆盖了 ActiveRecord destroy 方法,以便我们的记录不会被删除(因此用户可以取消删除)。像这样: def destroy self.is_deleted
我有一个笔记模型,具有以下关联 注意.rb has_many :note_categories, :dependent => :destroy has_many :categories, :throu
我是一名 Python 初学者。尝试制作一个新按钮来关闭窗口。我收到错误消息: Exception in Tkinter callback Traceback (most recent call la
我在我的应用程序中添加了评论功能,到目前为止一切正常,直到出现此错误。我所做的是添加了删除评论功能。当我启动服务器时一切正常,但在我单击“删除”按钮后问题出现了。 错误信息 undefined loc
Rails,def destroy,没有响应 destroy.js.erb 这是我的方法: # DELETE /Groups/1 # DELETE /Groups/1.xml def de
假设我有一个 MyClass 对象的集合 MyCollection。 Set MyCollection = Nothing 是否调用每个包含的对象的析构函数,或者我应该单独设置每个对象 = Nothi
我正在尝试使用 Node.js、Express 和 Mongodb 构建 REST API。我正在使用 mongodb npm 包连接到数据库,下面是我的 sever.js 文件代码 var expr
我有一个小问题,我有以下两个模型: class CriticalProcess :destroy has_many :roles, :through => :authorizations a
我正在使用 ng2-toastr 并收到以下错误 https://www.npmjs.com/package/ng2-toastr Attempt to use a destroyed view: d
基本信息: 系统: # cat /proc/version Linux version 3.10.0-514.2.2.el7.x86_64 (builder@kbuilder.dev.centos.o
一 点睛 destroy 用于销毁 ThreadGroup,该方法只是针对一个没有任何 active 线程的 group 进行一次 destroy 标记,调用该方法的直接结果是在父 group 中将自
我开始注意到 Scope::Guard 的一些奇怪之处。 . 如果我取消定义 $guard变量作为 sub 中的最后一个语句,守卫的 sub 得到 比我预期的要晚打电话。 如果我不取消它,或者如果我做
我正在构建一个提供打开和关闭它的服务的模式。该模式有一个控制关闭按钮的小 Controller ,以及进入模式内容的模板的 $compile。 那个模板就是一个组件,当然,那个组件有一个 Contro
一直在文件馆和网上寻找答案,但没有真正找到答案,只是零零碎碎。似乎有很多建议的帖子,但没有一个有答案。 我有一个使用范围的复杂指令:true。它实际上是我正在尝试为其编写清理代码的 ng-grid 最
给定以下 Delphi 代码,Foo 在 FormClose 上是 Free,但 TFoo.Destroy 是没有被调用 - 因此 Bar 没有被 Free'd,导致内存泄漏? 我是否在这里错过了一些
https://docs.angularjs.org/guide/directive By listening to this event, you can remove event listener
我是一名优秀的程序员,十分优秀!