如果有不止一种方法,请列出它们。我只知道一个,但我不知道是否有一个更清洁,在德胜路。

有帮助吗?

解决方案

如果这是你希望“自己的”(例如,您使用这个来验证自己控制的过程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.getpgidProcess::kill方法之间的差异似乎是当PID存在,但其他用户拥有会发生什么。 Process.getpgid将返回一个回答,Process::kill将抛出异常(Errno::EPERM)

在此基础上

,我建议Process.getpgid,如果只是为了它您就不必赶两个不同的异常的原因。

下面是我使用的代码:

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

@约翰T,@Dustin:事实上,好,我细读过程rdocs,它看起来像

Process.getpgid( pid )

是施加相同技术的少暴力手段。

这是我怎么一直在做:

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

您可以尝试使用

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

我已经经历了之前这个问题,昨天我编入“ process_exists 的”宝石。

它发送空信号(0)至处理与给定的PID,以检查是否存在。它的工作原理,即使当前用户不具有权限的信号发送到接收处理。

用法:

require 'process_exists'

pid = 12
pid_exists = Process.exists?(pid)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top