【发布时间】:2021-06-21 15:28:08
【问题描述】:
所以我确实意识到有人问过Find a process ID by name 类似的问题,但问题是,它确实返回了所有 PID 及其名称,包括该进程的衍生子进程。我的问题是如何只获取父进程的 PID 而不是其中一个子进程?
【问题讨论】:
所以我确实意识到有人问过Find a process ID by name 类似的问题,但问题是,它确实返回了所有 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 的进程。
要真正找到“根进程”,您需要通过检查其父进程是否不存在或不同的进程来进一步选择进程:
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")
【讨论】: