1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
use crate::processor; use serde::{Deserialize, Serialize}; use std::fs::File; use std::io::Read; use std::str; #[derive(Debug, Serialize, Deserialize, Default)] pub struct Process { pub processor_usage_with_children: f32, pub processor_usage: f32, pub rss: String, pub pid: String, } pub fn get_process(pid: &'static str) -> Result<Process, String> { let mut process = Process::default(); let mut file = match File::open(String::from("/proc/") + pid + "/status") { Ok(o) => o, Err(err) => return Err(err.to_string()), }; let mut content = String::new(); match file.read_to_string(&mut content) { Ok(o) => o, Err(err) => return Err(err.to_string()), }; for i in content .lines() .map(|line| { let mut fields = line.split(":"); let (k, v) = ( fields.next().unwrap_or("").trim(), fields.next().unwrap_or("").trim(), ); (k, v) }) .filter(|(k, v)| match *k { "VmRSS" | "Pid" => true, _ => false, }) { match i.0 { "VmRSS" => process.rss = i.1.replace(" kB", ""), "Pid" => process.pid = i.1.to_string(), _ => {} } } let processor_usage=get_process_usage(pid)?; process.processor_usage=processor_usage.0; process.processor_usage_with_children=processor_usage.1; Ok(process) } fn get_process_cpu_usage_with_children(pid: &'static str) -> Result<(u64, u64), String> { let mut file = match File::open(String::from("/proc/") + pid + "/stat") { Ok(o) => o, Err(err) => return Err(err.to_string()), }; let mut content = String::new(); match file.read_to_string(&mut content) { Ok(_) => {} Err(err) => return Err(err.to_string()), }; let fields: Vec<&str> = content.split_ascii_whitespace().collect(); if fields.len() < 17 {} Ok(( fields[13].parse::<u64>().unwrap() + fields[14].parse::<u64>().unwrap(), fields[13].parse::<u64>().unwrap() + fields[15].parse::<u64>().unwrap() + fields[14].parse::<u64>().unwrap() + fields[16].parse::<u64>().unwrap(), )) } fn get_process_usage(pid: &'static str) -> Result<(f32, f32), String> { let total_start = processor::get_total_processor_stat()?; let process_start = get_process_cpu_usage_with_children(pid)?; let processor_num = processor::get_processor().unwrap().len(); let total_stop = processor::get_total_processor_stat()?; let process_stop = get_process_cpu_usage_with_children(pid)?; Ok(( processor_num as f32 * (process_stop.0 - process_start.0) as f32 / (total_stop.get_total() - total_start.get_total()) as f32, processor_num as f32 * (process_stop.1 - process_start.1) as f32 / (total_stop.get_total() - total_start.get_total()) as f32, )) } #[test] fn get_process_test(){ println!("{:?}",get_process("1300")); }