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
这样的工具允许对子进程进行更多控制,并使您能够直接提供输入和捕获输出。
如何强制 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
这样的工具允许对子进程进行更多控制,并使您能够直接提供输入和捕获输出。