我需要看到一个给定的进程ID运行,它必须在Java或JRuby的(最好是一个Ruby的解决方案)的工作。 它可以是与系统有关的用于Linux(具体Debian和/或Ubuntu)。
我已经有我要找的PID,只需要看看它是否正在运行。
更新:
感谢所有的答复大家! 我很感激,但它并不完全符合我要找的......我在一个标准的Ruby库希望的东西(或Java,但最好红宝石)...如果没有这样的库调用存在,我可能会坚持使用procfs的解决方案,我已经有了。
我需要看到一个给定的进程ID运行,它必须在Java或JRuby的(最好是一个Ruby的解决方案)的工作。 它可以是与系统有关的用于Linux(具体Debian和/或Ubuntu)。
我已经有我要找的PID,只需要看看它是否正在运行。
更新:
感谢所有的答复大家! 我很感激,但它并不完全符合我要找的......我在一个标准的Ruby库希望的东西(或Java,但最好红宝石)...如果没有这样的库调用存在,我可能会坚持使用procfs的解决方案,我已经有了。
达隆的评论是点上,但不是调用“杀”二进制,你可以使用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
[用户@主机用户] $ ./is_running.rb 14302
14302运行[用户@主机用户] $ ./is_running.rb 99999
99999没有运行。[用户@主机用户] $ ./is_running.rb 37
没有权限查询37![用户@主机用户] $须藤./is_running.rb 37
37运行
参考: http://pleac.sourceforge.net/pleac_ruby/processmanagementetc.html
Unix有周围信号零杀系统调用的特殊功能。 错误检查执行,但不发送信号。
def pid_exists? (pid)
system "kill -0 #{pid}"
return $? == 0
end
警告:这会不会与PID,你没有权限信号检测过程。
从我的回答这个问题 ,我想只用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(在这种情况下,你将有一个实例启动的进程过程 ,你可以做的事情)。
你可能想仔细检查为您所使用的JVM。 但是,如果你发送一个SIGQUIT信号杀-3我相信,(我没有一个终端方便)。 这应该产生,这将有使用线程的堆栈跟踪一个javacore文件,检查该文件中的JRuby包。
它不应该终止或什么,但一如既往小心发送信号。
如果你不介意创建一个全新的进程那么这个偷懒的办法应该工作:
def pid_exists? (pid)
system "ps -p #{pid} > /dev/null"
return $? == 0
end
对于PS的大多数变化,应该对错误的成功和非零返回0。 与使用通常的误差以上将是没有找到处理与给定的PID。 PS的在Ubuntu下我的版本在这种情况下返回256。
您还可以使用Process.kill到为0的信号发送到进程(信号0指示是否可以将信号发送),但似乎如果你自己,你要发送的信号的过程中才有效(或以其他方式权限发送信号)。
您可以使用命令行工具jps
附带了Java安装。 JPS列出用户的所有Java进程。
如
>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