红宝石列表儿童pids

时间:2009-12-18 18:11:02

标签: ruby process

如何获取从ruby脚本启动的所有子进程的pid?

4 个答案:

答案 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上)。所以不值得实施。