我正在运行一个脚本来自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 :()
答案 0 :(得分:1)
您可能会在这里看到的是,您正在查杀nice
进程,而不是java
进程启动。
您可以通过直接启动java
进程然后使用您获得的PID上的renice
更改好的级别来避免这种情况。
还有必要检查你是否正在试图杀死正确的进程。正如你所指出的,意外产生第二个实例意味着你正在杀死错误的实例。
像popen3
这样的工具可以对子进程进行更多控制,并使您能够直接输入输入和捕获输出。