mirror of
https://github.com/m1ngsama/tracker.git
synced 2025-12-24 10:51:43 +00:00
feat: Implement process monitoring module
- Create ProcessMonitor using sysinfo System - Define ProcessInfo struct for process data - Implement get_top_processes() to find high CPU processes - Calculate CPU and memory usage percentages - Sort processes by CPU usage (descending) - Implement get_process_count() for total process count - Add display_processes() for formatted console output - Replicate Python version's process monitoring functionality
This commit is contained in:
parent
0dd5ecc441
commit
32ecbd8aff
1 changed files with 72 additions and 0 deletions
72
src/process.rs
Normal file
72
src/process.rs
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
use sysinfo::System;
|
||||||
|
|
||||||
|
pub struct ProcessMonitor {
|
||||||
|
sys: System,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct ProcessInfo {
|
||||||
|
pub pid: u32,
|
||||||
|
pub name: String,
|
||||||
|
pub cpu_percent: f32,
|
||||||
|
pub memory_percent: f32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ProcessMonitor {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
ProcessMonitor {
|
||||||
|
sys: System::new_all(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_top_processes(&mut self, limit: usize) -> Vec<ProcessInfo> {
|
||||||
|
self.sys.refresh_all();
|
||||||
|
|
||||||
|
let mut processes: Vec<ProcessInfo> = self.sys.processes()
|
||||||
|
.iter()
|
||||||
|
.map(|(pid, process)| {
|
||||||
|
let total_memory = self.sys.total_memory() as f32;
|
||||||
|
let memory_percent = if total_memory > 0.0 {
|
||||||
|
(process.memory() as f32 / total_memory) * 100.0
|
||||||
|
} else {
|
||||||
|
0.0
|
||||||
|
};
|
||||||
|
|
||||||
|
ProcessInfo {
|
||||||
|
pid: pid.as_u32(),
|
||||||
|
name: process.name().to_string_lossy().to_string(),
|
||||||
|
cpu_percent: process.cpu_usage(),
|
||||||
|
memory_percent,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
processes.sort_by(|a, b| b.cpu_percent.partial_cmp(&a.cpu_percent).unwrap());
|
||||||
|
processes.truncate(limit);
|
||||||
|
processes
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_process_count(&mut self) -> usize {
|
||||||
|
self.sys.refresh_all();
|
||||||
|
self.sys.processes().len()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn display_processes(&mut self, limit: usize) {
|
||||||
|
println!("\nTop Processes by CPU Usage:");
|
||||||
|
println!("{:<10}{:<30}{:<10}{:<10}", "PID", "Name", "CPU%", "Memory%");
|
||||||
|
println!("{}", "-".repeat(60));
|
||||||
|
|
||||||
|
for proc in self.get_top_processes(limit) {
|
||||||
|
println!("{:<10}{:<30}{:<10.2}{:<10.2}",
|
||||||
|
proc.pid, proc.name, proc.cpu_percent, proc.memory_percent);
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("\nTotal Processes: {}", self.get_process_count());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for ProcessMonitor {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue