如何通过Ruby获取非当前运行进程的相关信息?
获取非当前进程信息的Ruby实现方案
1. Ruby标准库的局限性
Ruby自带的Process模块主要聚焦于当前进程的操作(比如获取当前PID、当前用户ID),没有直接提供获取其他进程信息的API,所以需要借助第三方库或者平台特定的实现方式。
2. 跨平台第三方Gem:sys-proctable
这是最省心的方案,sys-proctable是跨平台的进程信息获取库,支持Linux、macOS、Windows等主流系统,API简洁易用。
使用步骤:
- 安装gem:
gem install sys-proctable
- 代码示例(贴近你想要的写法):
require 'sys/proctable' include Sys # 传入目标PID获取进程信息 proc_info = ProcTable.ps(1234) if proc_info puts "PID: #{proc_info.pid}" # 通过用户ID获取用户名 user_info = Sys::User.getpwuid(proc_info.euid) puts "所属用户: #{user_info.name}" # 进程启动时间(格式根据系统有所不同,部分系统返回Time对象) puts "运行时间: #{proc_info.starttime}" # 其他可用字段:cmdline(命令行)、cpu_usage(CPU使用率)等,不同平台字段略有差异 else puts "进程 #{1234} 不存在" end
3. 无依赖的平台特定实现(不推荐,移植性差)
如果不能使用第三方gem,可以针对不同系统写原生代码,比如Linux下读取/proc文件系统,macOS下调用系统API,但这种方式需要处理不同平台的差异,维护成本高。
Linux下示例(读取/proc文件系统):
require 'etc' def get_process_info(pid) proc_status_path = "/proc/#{pid}/status" return nil unless File.exist?(proc_status_path) status_data = {} File.read(proc_status_path).each_line do |line| key, val = line.split(':', 2) status_data[key.strip] = val.strip end # 提取启动时间需要额外处理/proc/[pid]/stat proc_stat_path = "/proc/#{pid}/stat" return nil unless File.exist?(proc_stat_path) stat_fields = File.read(proc_stat_path).split start_jiffies = stat_fields[21].to_i # 系统时钟节拍,可通过`getconf CLK_TCK`获取,大多Linux系统是100 hertz = 100 start_seconds_since_boot = start_jiffies.to_f / hertz uptime_seconds = File.read('/proc/uptime').split[0].to_f start_time = Time.now - uptime_seconds + start_seconds_since_boot { pid: pid, user: Etc.getpwuid(status_data['Uid'].split("\t")[0].to_i).name, start_time: start_time.strftime('%Y-%m-%d %H:%M:%S') } end # 使用示例 process = get_process_info(1234) if process puts "PID: #{process[:pid]}" puts "所属用户: #{process[:user]}" puts "启动时间: #{process[:start_time]}" else puts "进程不存在" end
内容的提问来源于stack exchange,提问作者tscheingeld
相关产品推荐
相关产品推荐

