【问题标题】:Windows Ruby get PID from process nameWindows Ruby 从进程名称中获取 PID
【发布时间】:2021-06-21 15:28:08
【问题描述】:

所以我确实意识到有人问过Find a process ID by name 类似的问题,但问题是,它确实返回了所有 PID 及其名称,包括该进程的衍生子进程。我的问题是如何只获取父进程的 PID 而不是其中一个子进程?

【问题讨论】:

    标签: ruby windows pid


    【解决方案1】:

    sys-proctable gem 可以做到这一点,这是获取系统上 ruby​​.exe 进程的 PID 的最小示例:

    require 'sys/proctable'
    
    def get_process_id(name)
        Sys::ProcTable.ps.detect{|p| p.name == name}&.pid
    end
    
    puts get_process_id("ruby.exe")
    

    这并不能保证您会找到父进程,而是会获得具有最低 PID 的进程。

    要真正找到“根进程”,您需要通过检查其父进程是否不存在或不同的进程来进一步选择进程:

    require 'sys/proctable'
    
    def get_parent_process_id(name)
        # generate a hash mapping pid -> process info
        processes = Sys::ProcTable.ps.map{|p| [p.pid, p]}.to_h
    
        # find the first matching process that has either no parent or a parent
        # that doesn't match the process name we're looking for
        processes.values.each do |p| 
            next if p.name != name
    
            if processes[p.ppid].nil? || processes[p.ppid].name != name
                return p.pid
            end
        end
    
        nil
    end
    
    puts get_parent_process_id("chrome.exe")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-11
      • 2011-06-16
      • 2023-04-10
      • 2012-08-29
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      相关资源
      最近更新 更多