小智 59
这些Process.getpgid和Process::kill方法之间的区别似乎是当pid存在但是由另一个用户拥有时会发生的情况.Process.getpgid将返回一个答案,Process::kill将抛出异常(Errno::EPERM).
基于此,我建议Process.getpgid,如果只是因为它可以使您免于捕获两个不同的异常.
这是我使用的代码:
begin
Process.getpgid( pid )
true
rescue Errno::ESRCH
false
end
Run Code Online (Sandbox Code Playgroud)
Dus*_*tin 47
如果它是您希望"拥有"的进程(例如,您使用此进程来验证您控制的进程的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
>>
Run Code Online (Sandbox Code Playgroud)
Pis*_*tos 46
@John T,@ Dustin:实际上,伙计们,我仔细阅读了过程rdocs,它看起来像
Process.getpgid( pid )
Run Code Online (Sandbox Code Playgroud)
应用相同技术是一种不那么暴力的手段.
bal*_*alu 27
对于子进程,其他解决方案(如发送信号)将不会按预期运行:它们将指示进程在实际退出时仍在运行.
如果要检查自己生成的进程,可以使用Process.waitpid.如果您正在使用该Process::WNOHANG标志,nil则不会阻止该调用,只要子进程未退出,该调用将被返回.
例:
pid = Process.spawn('sleep 5')
Process.waitpid(pid, Process::WNOHANG) # => nil
sleep 5
Process.waitpid(pid, Process::WNOHANG) # => pid
Run Code Online (Sandbox Code Playgroud)
如果pid不属于子进程,则抛出异常(Errno::ECHILD: No child processes).
这同样适用于Process.waitpid2.
这就是我一直在做的事情:
def alive?(pid)
!!Process.kill(0, pid) rescue false
end
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以尝试使用
Process::kill 0, pid
Run Code Online (Sandbox Code Playgroud)
其中 pid 是 pid 编号,如果 pid 正在运行,则应返回 1。
| 归档时间: |
|
| 查看次数: |
30851 次 |
| 最近记录: |