Windows Ruby 从进程名获取 PID

Windows Ruby get PID from process name

所以我确实意识到有人问过类似的问题 Find a process ID by name 但事实是,它确实 returns 所有 PID 都有他们的名字,包括该进程的派生子进程。我的问题是我怎样才能只获得父进程的 PID 而不是其中一个子进程?

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 最低的进程。

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

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")