如何确定在Linux上使用Java或者JRuby是否正在运行其他进程ID?
我需要查看给定的进程ID是否正在运行,并且它必须在Java或者JRuby(最好是Ruby解决方案)中都可以工作。对于Linux(特别是Debian和/或者Ubuntu),它可能与系统有关。
我已经有了要查找的PID,只需要查看它当前是否正在运行即可。
更新:
感谢大家的所有答复!我很感激,但是并不是我想要的...我希望在标准的Ruby库(或者Java,但最好是Ruby)中寻找某些东西...如果不存在这样的库调用,我可能会坚持我已经拥有的procfs解决方案。
解决方案
根据对这个问题的回答,我正在考虑通过File.exist检查给定目录是否存在,再次使用procfs? " / 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表示是否可以发送信号),但这似乎仅在我们拥有要向其发送信号的进程时才起作用。发送信号的权限)。
Unix具有信号零附近的kill系统调用的特殊功能。执行错误检查,但未发送信号。
def pid_exists? (pid) system "kill -0 #{pid}" return $? == 0 end
一个警告:这将不会检测到我们没有信号权限的那个pid的进程。
Darron的评论很明确,但是我们可以仅将Ruby的Process.kill方法与0信号一起使用,而不必调用" kill"二进制文件:
#!/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 [user@host user]$ ./is_running.rb 99999 99999 is NOT running. [user@host user]$ ./is_running.rb 37 No permission to query 37! [user@host user]$ sudo ./is_running.rb 37 37 is running
参考:http://pleac.sourceforge.net/pleac_ruby/processmanagementetc.html
我们可以使用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