代码之家  ›  专栏  ›  技术社区  ›  tig Charlie Martin

ruby列表子PID

  •  10
  • tig Charlie Martin  · 技术社区  · 15 年前

    4 回复  |  直到 15 年前
        1
  •  13
  •   grosser    6 年前

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

    Process.pid
    

    看见 http://whynotwiki.com/Ruby_/_Process_management 详情请参阅。

    然后,您可以使用特定于操作的命令来获取子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
    

    我承认这可能不适用于所有unix系统,因为我相信 ps -ef 在不同的unix风格上略有不同。

        2
  •  6
  •   Colin Curtin    15 年前

    Process.fork使用生成的子进程的PID进行响应。只要在生成子对象时在阵列中跟踪它们就可以了。看见 http://ruby-doc.org/core/classes/Process.html#M003148

        3
  •  3
  •   tig Charlie Martin    12 年前

    也可以使用 sys-proctable 宝石:

    require 'sys/proctable'
    
    Sys::ProcTable.ps.select{ |pe| pe.ppid == $$ }
    
        4
  •  1
  •   akostadinov    9 年前

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

    供参考使用 ps 找出流程层次结构是非常不可靠的。如果链中有一个进程退出,则其子进程的父pid为 1