ruby列表子PID

ruby列表子PID,ruby,process,Ruby,Process,如何获取从ruby脚本启动的所有子进程的PID?Process.fork使用生成的子进程的PID进行响应。只要在生成子对象时在阵列中跟踪它们就可以了。请参阅。您可以通过以下方式获得当前流程: Process.pid 有关更多详细信息,请参阅 然后,您可以使用特定于操作的命令来获取子PID。在基于unix的系统上,这将是与 # Creating 3 child processes. IO.popen('uname') IO.popen('uname') IO.popen('uname') #

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

Process.fork使用生成的子进程的PID进行响应。只要在生成子对象时在阵列中跟踪它们就可以了。请参阅。

您可以通过以下方式获得当前流程:

Process.pid
有关更多详细信息,请参阅

然后,您可以使用特定于操作的命令来获取子PID。在基于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系统,因为我相信不同unix风格的
ps-ef
的输出略有不同。

也可以使用
sys proctable
gem:

require 'sys/proctable'

Sys::ProcTable.ps.select{ |pe| pe.ppid == $$ }

这实际上非常复杂,并且是特定于平台的。实际上,如果子进程有意隐藏,则无法找到所有子进程

如果您只想杀死繁殖的进程,有很多选择。对于测试框架,我选择了两个: 1.使用
pgid=>true生成进程
2.插入变量MY_CUSTOM_COOKIE=asjdkahf
,然后在环境中找到带有该COOKIE的进程并将其杀死


仅供参考,使用
ps
找出流程层次结构是非常不可靠的。如果链中有一个进程退出,则其子进程的父pid为
1
(至少在linux上)。因此它不值得实现。

Process.pid
返回当前进程的pid,而不是父进程。要获取父进程pid,请执行
process.ppid
。注释中有一个错误,我们需要当前进程,因为它将是子进程的父进程。只需几美分:“ps o pid=--ppid#{pid}”可能比“ps-ef | grep#{pid}”更方便在这种情况下,您不必过滤掉不需要的行和字段。这将是一个很好的变体,但在我的例子中,我有一个生成块的方法,也是跟踪对fork、system、spawn、backtrick和其他方法的所有调用的唯一方法。它通过pid计数器将这些方法链接起来,但我希望有更简单的方法获得子pid