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")
所以我确实意识到有人问过类似的问题 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")