【发布时间】:2015-03-04 20:03:46
【问题描述】:
如何强制退出/杀死被 IO.popen("command", "r+") 盯着的 java 进程?
我正在运行一个脚本,一个来自 ruby 的小型 Java 程序,执行以下操作:
pipe = IO.popen("nice -n 19 java -Xmx2g -Djava.awt.headless=true -jar java_program.jar", 'r+')
然后我使用 stdio 来回发送参数,如下所示:
pipe.puts "data"
result = pipe.gets
这适用于我发送的大多数数据,但对于某些 java 进程似乎锁定或什么的,我想强制关闭/终止 java 进程。
我目前正在执行以下操作,这似乎并没有杀死 java 进程(来自另一个监视这些东西的线程):
thepid = nil
thepid = pipe.pid if pipe.respond_to?(:pid)
pipe.puts('') if pipe.respond_to?(:puts) #This is the java_program's approach to closing, writing empty string to stdio will cause it to start it's shutdown procedure.
pipe.close if pipe.respond_to?(:close)
Process.kill('KILL', thepid) if thepid && Process.getpgid( thepid )
java 进程徘徊并拒绝死亡。我该怎么做才能真正强制进程退出(它使用大量内存:()
另外:是否有跨平台的方式来做到这一点?
【问题讨论】:
-
你试过
popen3吗?你的kill电话的结果是什么?你确定你的目标是正确的PID吗?您可能正在杀死nice进程,而不是java进程。 -
popen3会有什么不同吗?我对此了解不多。除了 3 个不同的 IO 之外,它的工作方式是否与普通的popen不同?