2

特定のプロセス ID が実行されているかどうかを確認する必要があり、Java または JRuby (できれば Ruby ソリューション) で動作する必要があります。Linux (特に Debian および/または Ubuntu) のシステムに依存する場合があります。

探している PID は既にありますが、現在実行されているかどうかを確認する必要があります。


アップデート:

みなさん、たくさんの反応をありがとう!感謝していますが、私が探しているものはそれほど多くありません...標準のRubyライブラリ(またはJava、できればRuby)で何かを望んでいます...そのようなライブラリ呼び出しが存在しない場合は、おそらく固執します私がすでに持っているprocfsソリューション。

4

7 に答える 7

11

Darron のコメントは的を射ていましたが、「kill」バイナリを呼び出すのではなく、0 シグナルで Ruby の Process.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 は実行中です

[user@host user]$ ./is_running.rb 99999
99999 は実行されていません。

[user@host user]$ ./is_running.rb 37 37
を照会する権限がありません!

[user@host user]$ sudo ./is_running.rb 37
37 は実行中です

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

于 2008-10-14T09:51:51.017 に答える
5

Unix には、シグナル ゼロの前後で kill システム コールという特別な機能があります。エラー チェックは実行されますが、シグナルは送信されません。

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

1 つの注意点: これは、シグナルを送信する権限がない pid を持つプロセスを検出しません。

于 2008-09-26T20:23:37.557 に答える
2

この質問に対する私の答えから、指定されたディレクトリが File.exist? 経由で存在するかどうかを確認して、procfs をもう一度使用することを考えていました。"/proc/#{pid}". これはjirbで機能しました:

irb(main):001:0> ファイルが存在しますか? "/proc/5555"
=>偽
irb(main):002:0> ファイルが存在しますか? 「/proc/7677」
=>真

ただし、プロセスが実行されているかどうかを検出するために特に存在するメソッドを使用することをお勧めします... Process.exist?(pid)... のように、残念ながら私が見たものは存在しません。

于 2008-09-26T18:34:27.743 に答える
0

jpsJavaインストールに付属しているコマンドラインツールを使用できます。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
于 2010-11-25T16:20:46.350 に答える
0

使用している JVM を再確認することをお勧めします。しかし、 SIGQUITシグナル kill -3 を送信した場合、私は信じています (手元に端末がありません)。これにより、使用中のスレッドのスタック トレースを含む Javacore ファイルが生成されます。そのファイルで JRuby パッケージを確認します。

終了するべきではありませんが、常にシグナルの送信には注意してください。

于 2008-09-26T19:00:37.883 に答える
0

まったく新しいプロセスを作成してもかまわない場合は、この怠惰な方法が機能するはずです。

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

psのほとんどのバリエーションでは、成功時に 0 を返し、エラー時にゼロ以外を返す必要があります。上記の使用法での通常のエラーは、指定された PID を持つプロセスが見つからないことです。この場合、Ubuntu で使用しているpsのバージョンは 256 を返します。

Process.kill を使用して 0 のシグナルをプロセスに送信することもできます (シグナル 0 は、シグナルが送信されるかどうかを示します)。シグナルを送信する許可)。

于 2008-09-26T20:10:45.843 に答える
0

JRuby について話すことはできませんが、Java で確認する唯一の方法は、Java からプロセスを起動したかどうかです (その場合、処理できるProcessのインスタンスが存在します)。

于 2008-09-26T18:40:34.997 に答える