複数の方法がある場合は、それらをリストしてください。私が知っているのは 1 つだけですが、よりクリーンな Ruby 内の方法があるかどうか疑問に思っています。
9 に答える
Process.getpgid
とアプローチの違いはProcess::kill
、pidが存在するが、別のユーザーが所有している場合に発生するようです。Process.getpgid
回答を返し、Process::kill
例外をスローします(Errno::EPERM)
。
これに基づいて、Process.getpgid
2つの異なる例外をキャッチする必要がないという理由だけで、をお勧めします。
私が使用するコードは次のとおりです。
begin
Process.getpgid( pid )
true
rescue Errno::ESRCH
false
end
それが「所有」することが期待されるプロセスである場合 (たとえば、これを使用して、制御するプロセスの 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
>>
@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にも当てはまります。
使用してみることができます
Process::kill 0, pid
ここで、pid は pid 番号です。pid が実行されている場合、1 が返されます。
Linux では、proc ファイルシステムを使用して、実行中のプログラムの多くの属性を取得できます。
File.read("/proc/#{pid}/cmdline")
File.read("/proc/#{pid}/comm")
のみの*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