web-dev-qa-db-ja.com

Rubyから特定のpidのプロセスが実行されているかどうかを確認するにはどうすればよいですか?

複数の方法がある場合は、リストしてください。私は1つしか知りませんが、よりクリーンなRuby内の方法があるかどうか疑問に思っています。

45
Pistos

それが「所有」すると予想されるプロセスである場合(たとえば、これを使用して、制御するプロセスの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
>> 
47
Dustin

Process.getpgidProcess::killのアプローチの違いは、pidは存在するが別のユーザーが所有している場合にどうなるかです。 Process.getpgidは回答を返し、Process::killは例外(Errno::EPERM)をスローします。

そのため、2つの異なる例外をキャッチする必要がなくなるという理由だけで、Process.getpgidをお勧めします。

これが私が使用するコードです:

begin
  Process.getpgid( pid )
  true
rescue Errno::ESRCH
  false
end
59
tonystubblebine

@John T、@ Dustin:実際、みんな、Process rdocsをよく読んだところ、

Process.getpgid( pid )

同じテクニックを適用する、それほど暴力的でない手段です。

47
Pistos

子プロセスの場合、シグナルの送信などの他のソリューションは期待どおりに動作しません。実際に終了したときに、プロセスがまだ実行中であることを示します。

自分で生成したプロセスを確認したい場合は、 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 にも当てはまります。

28
balu

これは私がそれをやってきた方法です:

def alive?(pid)
  !!Process.kill(0, pid) rescue false
end
6
komatsu

Linuxでは、procファイルシステムを使用して実行中のプログラムの多くの属性を取得できます。

File.read("/proc/#{pid}/cmdline")
File.read("/proc/#{pid}/comm")
4
amenzhinsky

あなたは使ってみることができます

Process::kill 0, pid

ここで、pidはpid番号です。pidが実行されている場合は、1を返します。

4
John T

*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
0
Daniel Doezema

私はこの問題に対処したことがあり、昨日は「 process_exists gem」にコンパイルしました。

これは、nullシグナル(0)を指定されたpidのプロセスに送信して、存在するかどうかを確認します。現在のユーザーが信号を受信プロセスに送信する権限を持っていない場合でも機能します。

使用法:

require 'process_exists'

pid = 12
pid_exists = Process.exists?(pid)
0
Wilson Silva