如何获取从ruby脚本启动的所有子进程的pid?
答案 0 :(得分:12)
您可以通过以下方式获取当前流程:
Process.pid
有关详细信息,请参阅http://whynotwiki.com/Ruby_/_Process_management。
然后,您可以使用特定于操作的命令来获取子pids。在基于unix的系统上,这将是
的内容# Creating 3 child processes.
IO.popen('uname')
IO.popen('uname')
IO.popen('uname')
# Grabbing the pid.
pid = Process.pid
# Get the child pids.
pipe = IO.popen("ps -ef | grep #{pid}")
child_pids = pipe.readlines.map do |line|
parts = line.lstrip.split(/\s+/)
parts[1] if parts[2] == pid.to_s and parts[1] != pipe.pid.to_s
end.compact
# Show the child processes.
puts child_pids
在osx + ubuntu上测试。
我承认这可能不适用于所有unix系统,因为我认为ps -ef
的输出在不同的unix风格上略有不同。
答案 1 :(得分:6)
Process.fork响应生成的子进程的PID。在生成孩子时,只需在数组中跟踪它们。请参阅http://ruby-doc.org/core/classes/Process.html#M003148。
答案 2 :(得分:2)
也可以使用sys-proctable
gem:
require 'sys/proctable'
Sys::ProcTable.ps.select{ |pe| pe.ppid == $$ }
答案 3 :(得分:1)
这实际上很安静,并且是特定于平台的。如果他们故意试图隐藏,你实际上不能找到所有子流程。
如果你想杀死衍生的进程,有很多选择。对于测试框架,我选择了两个:
1.使用pgid => true
生成进程
2.插入变量MY_CUSTOM_COOKIE=asjdkahf
,然后在环境中找到带有该cookie的过程并将其删除。
使用ps
来查找流程层次结构是非常不可靠的。如果链中的一个进程退出,那么它的子进程将获得1
的父pid(至少在linux上)。所以不值得实施。