我怎样才能确定一个不同的进程ID使用Java或JRuby的在Linux上运行?(How can I

2019-08-05 05:36发布

我需要看到一个给定的进程ID运行,它必须在Java或JRuby的(最好是一个Ruby的解决方案)的工作。 它可以是与系统有关的用于Linux(具体Debian和/或Ubuntu)。

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


更新:

感谢所有的答复大家! 我很感激,但它并不完全符合我要找的......我在一个标准的Ruby库希望的东西(或Java,但最好红宝石)...如果没有这样的库调用存在,我可能会坚持使用procfs的解决方案,我已经有了。

Answer 1:

达隆的评论是点上,但不是调用“杀”二进制,你可以使用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



Answer 2:

Unix有周围信号零杀系统调用的特殊功能。 错误检查执行,但不发送信号。

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

警告:这会不会与PID,你没有权限信号检测过程。



Answer 3:

从我的回答这个问题 ,我想只用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)......不幸的是不存在的,我已经看到。



Answer 4:

我不能为JRuby的说话,但在Java中,要检查的唯一途径是,如果你从Java(在这种情况下,你将有一个实例启动的进程过程 ,你可以做的事情)。



Answer 5:

你可能想仔细检查为您所使用的JVM。 但是,如果你发送一个SIGQUIT信号杀-3我相信,(我没有一个终端方便)。 这应该产生,这将有使用线程的堆栈跟踪一个javacore文件,检查该文件中的JRuby包。

它不应该终止或什么,但一如既往小心发送信号。



Answer 6:

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

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

对于PS的大多数变化,应该对错误的成功和非零返回0。 与使用通常的误差以上将是没有找到处理与给定的PID。 PS的在Ubuntu下我的版本在这种情况下返回256。

您还可以使用Process.kill到为0的信号发送到进程(信号0指示是否可以将信号发送)​​,但似乎如果你自己,你要发送的信号的过程中才有效(或以其他方式权限发送信号)。



Answer 7:

您可以使用命令行工具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


文章来源: How can I determine if a different process id is running using Java or JRuby on Linux?