Show found processes as tree in Filtered mode

This commit is contained in:
aNNiMON 2024-07-24 19:54:04 +03:00
parent 63c21f929f
commit b0814b8a83

View File

@ -1,6 +1,6 @@
use itertools::Itertools; use itertools::Itertools;
use processes::{terminate_process, ProcessInfo}; use processes::{terminate_process, ProcessInfo};
use std::collections::HashMap; use std::collections::{HashMap, HashSet};
use std::process::ExitCode; use std::process::ExitCode;
use std::{env, fmt::Display}; use std::{env, fmt::Display};
@ -18,11 +18,6 @@ enum Mode {
Help, Help,
} }
// pkill => all unique processed, excl. svchost
// pkill --all => all processes, incl. svchost
// pkill <regex> => filtered processes
// pkill --pid name => PID of the first occurence
// pkill --kill PID/name => terminate process by its PID or name
fn main() -> ExitCode { fn main() -> ExitCode {
match parse_mode() { match parse_mode() {
Mode::All => { Mode::All => {
@ -30,7 +25,11 @@ fn main() -> ExitCode {
ExitCode::SUCCESS ExitCode::SUCCESS
} }
Mode::Tree => { Mode::Tree => {
show_processes_tree(); let processes: Vec<ProcessInfo> = processes::list_processes()
.into_iter()
.sorted_by_key(|p| p.parent_pid)
.collect();
show_processes_tree(processes);
ExitCode::SUCCESS ExitCode::SUCCESS
} }
Mode::Minimal => { Mode::Minimal => {
@ -38,6 +37,8 @@ fn main() -> ExitCode {
"svchost", "svchost",
"registry", "registry",
"[system process]", "[system process]",
"system",
"memory compression",
"smss.exe", "smss.exe",
"csrss.exe", "csrss.exe",
"lsass.exe", "lsass.exe",
@ -55,11 +56,24 @@ fn main() -> ExitCode {
ExitCode::SUCCESS ExitCode::SUCCESS
} }
Mode::Filtered(filter) => { Mode::Filtered(filter) => {
show_processes_table( let all_processes = processes::list_processes();
processes::list_processes() let filtered_pids: HashSet<u32> = all_processes
.iter() .clone()
.filter(|p| p.name.to_ascii_lowercase().contains(&filter)) .into_iter()
.sorted_by_key(|p| &p.name), .flat_map(|p| {
if p.name.to_ascii_lowercase().contains(&filter) {
vec![p.pid, p.parent_pid]
} else {
vec![]
}
})
.collect();
show_processes_tree(
all_processes
.into_iter()
.filter(|p| filtered_pids.contains(&p.pid))
.sorted_by_key(|p| p.name.clone())
.collect(),
); );
ExitCode::SUCCESS ExitCode::SUCCESS
} }
@ -145,12 +159,7 @@ fn parse_mode() -> Mode {
mode mode
} }
fn show_processes_tree() { fn show_processes_tree(processes: Vec<ProcessInfo>) {
let processes: Vec<ProcessInfo> = processes::list_processes()
.into_iter()
.sorted_by_key(|p| p.parent_pid)
.collect();
let by_pid: HashMap<u32, ProcessInfo> = let by_pid: HashMap<u32, ProcessInfo> =
processes.clone().into_iter().map(|p| (p.pid, p)).collect(); processes.clone().into_iter().map(|p| (p.pid, p)).collect();
let mut tree: HashMap<u32, Vec<ProcessInfo>> = HashMap::new(); let mut tree: HashMap<u32, Vec<ProcessInfo>> = HashMap::new();