Ruby 强制关闭 IO.popen java 进程

Ruby force close IO.popen java process

如何强制 quit/kill 由 IO.popen("command", "r+") 启动的 java 进程?

我是 运行 一个脚本 java 来自 ruby 的小程序,它正在执行以下操作:

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 :( )

另外:是否有跨平台的方式来做到这一点?

您可能在这里看到的是您正在终止 nice 进程,而不是它启动的 java 进程。

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

还值得检查一下您是否正在尝试终止正确的进程。正如您所指出的,意外产生第二个实例意味着您杀死了错误的实例。

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