Ruby强制关闭IO.popen java进程

时间:2015-03-04 20:03:47

标签: ruby popen kill

如何强制退出/终止使用IO.popen("命令"," 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进程徘徊并拒绝死亡。我该怎么做才能真正强制进程退出(它使用了大量的ram :()

另外:有这样的跨平台方式吗?

1 个答案:

答案 0 :(得分:1)

您可能会在这里看到的是,您正在查杀nice进程,而不是java进程启动。

您可以通过直接启动java进程然后使用您获得的PID上的renice更改好的级别来避免这种情况。

还有必要检查你是否正在试图杀死正确的进程。正如你所指出的,意外产生第二个实例意味着你正在杀死错误的实例。

popen3这样的工具可以对子进程进行更多控制,并使您能够直接输入输入和捕获输出。