如果有多种方式,请列出.我只知道一个,但我想知道是否有一个更干净的Ruby内部方式.
这些Process.getpgid
和Process::kill
方法之间的区别似乎是当pid存在但是由另一个用户拥有时会发生的情况.Process.getpgid
将返回一个答案,Process::kill
将抛出异常(Errno::EPERM)
.
基于此,我建议Process.getpgid
,如果只是因为它可以使您免于捕获两个不同的异常.
这是我使用的代码:
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:实际上,伙计们,我仔细阅读了过程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