複数の方法がある場合は、リストしてください。私は1つしか知りませんが、よりクリーンなRuby内の方法があるかどうか疑問に思っています。
それが「所有」すると予想されるプロセスである場合(たとえば、これを使用して、制御するプロセスのPIDを検証している場合)、それにsig 0を送信するだけで済みます。
>> Process.kill 0, 370
=> 1
>> Process.kill 0, 2
Errno::ESRCH: No such process
from (irb):5:in `kill'
from (irb):5
>>
Process.getpgid
とProcess::kill
のアプローチの違いは、pidは存在するが別のユーザーが所有している場合にどうなるかです。 Process.getpgid
は回答を返し、Process::kill
は例外(Errno::EPERM)
をスローします。
そのため、2つの異なる例外をキャッチする必要がなくなるという理由だけで、Process.getpgid
をお勧めします。
これが私が使用するコードです:
begin
Process.getpgid( pid )
true
rescue Errno::ESRCH
false
end
@John T、@ Dustin:実際、みんな、Process rdocsをよく読んだところ、
Process.getpgid( pid )
同じテクニックを適用する、それほど暴力的でない手段です。
子プロセスの場合、シグナルの送信などの他のソリューションは期待どおりに動作しません。実際に終了したときに、プロセスがまだ実行中であることを示します。
自分で生成したプロセスを確認したい場合は、 Process.waitpid を使用できます。 Process::WNOHANG
フラグを使用している場合、呼び出しはブロックされません。子プロセスが終了しない限り、nil
が返されます。
例:
pid = Process.spawn('sleep 5')
Process.waitpid(pid, Process::WNOHANG) # => nil
sleep 5
Process.waitpid(pid, Process::WNOHANG) # => pid
Pidが子プロセスに属していない場合、例外がスローされます(Errno::ECHILD: No child processes
)。
同じことが Process.waitpid2 にも当てはまります。
これは私がそれをやってきた方法です:
def alive?(pid)
!!Process.kill(0, pid) rescue false
end
Linuxでは、procファイルシステムを使用して実行中のプログラムの多くの属性を取得できます。
File.read("/proc/#{pid}/cmdline")
File.read("/proc/#{pid}/comm")
あなたは使ってみることができます
Process::kill 0, pid
ここで、pidはpid番号です。pidが実行されている場合は、1を返します。
*nix
のみのアプローチは、ps
にシェルアウトし、\n
(改行)区切り文字が返された文字列に存在します。
IRB出力の例
1.9.3p448 :067 > `ps -p 56718`
" PID TTY TIME CMD\n56718 ttys007 0:03.38 zeus slave: default_bundle \n"
メソッドとしてパッケージ化
def process?(pid)
!!`ps -p #{pid.to_i}`["\n"]
end
私はこの問題に対処したことがあり、昨日は「 process_exists gem」にコンパイルしました。
これは、nullシグナル(0)を指定されたpidのプロセスに送信して、存在するかどうかを確認します。現在のユーザーが信号を受信プロセスに送信する権限を持っていない場合でも機能します。
使用法:
require 'process_exists'
pid = 12
pid_exists = Process.exists?(pid)