2008-09-26 62 views
2

我需要查看给定的进程ID是否正在运行,并且它必须在Java或JRuby(最好是Ruby解决方案)中工作。 Linux可以依赖于系统(特别是Debian和/或Ubuntu)。如何确定在Linux上是否使用Java或JRuby运行不同的进程ID?

我已经有了我正在寻找的PID,只需要看看它是否正在运行。


UPDATE:

感谢所有的答复大家!我很欣赏它,但它不是我正在寻找的QUITE ...我希望在标准Ruby库(或Java,但最好是Ruby)中有东西......如果没有这样的库调用存在,我可能会坚持我已经拥有的procfs解决方案。

+0

迈克,你的问题的称号意味着你想知道是否给定的PID本身是一个Java | JRuby进程。问题的其余部分表明您只打算让我们使用Java | JRuby来了解给定PID的退出情况。请澄清! – 2008-09-26 19:49:40

+0

谢谢!我更新,希望澄清 – 2008-09-26 20:26:58

回答

2

my answer to this question,我想再次使用procfs,通过检查给定的目录是否存在通过File.exist? “/ PROC /#{PID}”。这曾在jirb:

 
irb(main):001:0> File.exist? "/proc/5555" 
=> false 
irb(main):002:0> File.exist? "/proc/7677" 
=> true 

不过,我还是更愿意使用专门存在,如果一个进程正在运行...喜欢Process.exist检测方法(PID)......不幸的是没有按”?我见过的。

0

我不能说JRuby,但是在Java中,检查的唯一方法是如果您是从Java启动进程(在这种情况下,您将拥有一个可以执行操作的实例Process)。

+0

谢谢,但不幸的是,这个过程不是一个子进程 – 2008-09-26 18:43:55

+0

那么,这是值得一试。 :) – 2008-09-26 18:45:11

0

您可能需要仔细检查您使用的JVM。但是如果你发送一个SIGQUIT信号杀-3我相信,(我没有一个终端方便)。这应该会生成一个Javacore文件,该文件将包含正在使用的线程的堆栈跟踪,并检查该文件中的JRuby包。

它不应该终止或任何东西,但始终要小心发送信号。

0

如果你不介意创建一个全新的进程那么这个偷懒的办法应该工作:

def pid_exists? (pid) 
    system "ps -p #{pid} > /dev/null" 
    return $? == 0 
end 

对于PS的大多数变化,应该对成功和非零的错误返回0。上述用法的常见错误将无法找到给定PID的进程。 的版本ps我在Ubuntu下有这种情况返回256。

您也可以使用Process.kill向进程发送0的信号(信号0指示是否可以发送信号),但似乎只有在您拥有发送信号的进程时才有效(或以其他方式有权发送信号)。

5

Unix有一个围绕信号零的kill系统调用的特殊功能。错误检查被执行,但没有信号被发送。

def pid_exists? (pid) 
    system "kill -0 #{pid}" 
    return $? == 0 
end 

一个警告:这不会检测到该进程与您没有权限的信号。

9

Darron's comment很有用,但不是调用“kill”二进制文件,而是使用Ruby的进程。与0信号杀方法:

#!/usr/bin/ruby 

pid = ARGV[0].to_i 

begin 
    Process.kill(0, pid) 
    puts "#{pid} is running" 
rescue Errno::EPERM      # changed uid 
    puts "No permission to query #{pid}!"; 
rescue Errno::ESRCH 
    puts "#{pid} is NOT running.";  # or zombied 
rescue 
    puts "Unable to determine status for #{pid} : #{$!}" 
end 

[用户@主机用户] $ ./is_running.rb 14302
14302运行

[用户@主机用户] $ ./is_running.rb 99999
99999未运行。

[user @ host user] $ ./is_running.rb 37
没有权限查询37!

[用户@主机用户] $ sudo的./is_running.rb 37
37运行

参考:http://pleac.sourceforge.net/pleac_ruby/processmanagementetc.html

0

你可以使用命令行工具jps附带了Java安装。 jps列出了用户的所有java进程。

E.g.

>jps -l 
5960 org.jruby.Main 
2124 org.jruby.Main 
5376 org.jruby.Main 
4428 sun.tools.jps.Jps 

或者,如果你需要得到的结果到你的脚本,你可以使用%×[..]:

>> result = %x[jps -l] 
=> "5960 org.jruby.Main\n2264 sun.tools.jps.Jps\n2124 org.jruby.Main\n5376 org.jruby.Main\n" 
>> p result 
"5960 org.jruby.Main\n2264 sun.tools.jps.Jps\n2124 org.jruby.Main\n5376 org.jruby.Main\n" 
=> nil 
相关问题