51

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

4

9 に答える 9

62

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

これに基づいて、Process.getpgid2つの異なる例外をキャッチする必要がないという理由だけで、をお勧めします。

私が使用するコードは次のとおりです。

begin
  Process.getpgid( pid )
  true
rescue Errno::ESRCH
  false
end
于 2010-08-25T16:43:41.193 に答える
53

それが「所有」することが期待されるプロセスである場合 (たとえば、これを使用して、制御するプロセスの 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
>> 
于 2008-11-28T05:17:26.633 に答える
46

@John T、@Dustin: 実際、皆さん、私は Process rdocs を熟読しましたが、次のように見えます

Process.getpgid( pid )

同じテクニックを適用するより暴力的でない手段です。

于 2008-11-28T05:23:57.027 に答える
31

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

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

于 2013-01-17T15:00:25.330 に答える
5

使用してみることができます

Process::kill 0, pid

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

于 2008-11-28T05:19:38.830 に答える
4

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

File.read("/proc/#{pid}/cmdline")
File.read("/proc/#{pid}/comm")
于 2014-01-03T11:35:56.183 に答える
0

のみの*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
于 2013-09-05T14:40:28.280 に答える