题
如果有不止一种方法,请列出它们。我只知道一个,但我不知道是否有一个更清洁,在德胜路。
解决方案
如果这是你希望“自己的”(例如,您使用这个来验证自己控制的过程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)
。
,我建议Process.getpgid
,如果只是为了它您就不必赶两个不同的异常的原因。
下面是我使用的代码:
begin
Process.getpgid( pid )
true
rescue Errno::ESRCH
false
end
@约翰T,@Dustin:事实上,好,我细读过程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
您可以尝试使用
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)