我如何确定在Linux上是否使用Java或JRuby运行不同的进程ID?

我需要看看给定的进程ID是否正在运行,它必须在Java或JRuby(最好是Ruby解决scheme)中工作。 Linux可以依赖于系统(特别是Debian和/或Ubuntu)。

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


更新:

感谢所有人的回应! 我很欣赏它,但它不是什么我正在寻找…我希望在标准的Ruby库(或Java,但最好是Ruby)的东西…如果没有这样的库调用存在,我可能会坚持我已经有了procfs解决scheme。

Solutions Collecting From Web of "我如何确定在Linux上是否使用Java或JRuby运行不同的进程ID?"

Darron的评论很有意思 ,但是不是调用“kill”二进制文件,而是使用Ruby的Process.kill方法和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 

[user @ host user] $ ./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

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

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

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

从我对这个问题的回答中 ,我正在考虑再次使用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)…不幸的是,我不知道。

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

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

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

如果你不介意创建一个全新的过程,那么这个懒惰的方式应该工作:

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

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

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

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

例如

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

或者,如果您需要将结果导入脚本,则可以使用%x [..]:

 >> 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