use procfs::process::{all_processes, Process};
fn main() {
let processes = match all_processes() {
Err(err) => {
println!("Failed to read all processes: {}", err);
return;
}
Ok(processes) => processes,
};
for process in &processes {
if process.stat.ppid == 0 {
print_process(process, &processes, 0);
}
}
}
fn print_process(process: &Process, all_processes: &[Process], depth: usize) {
let cmdline = match process.cmdline() {
Ok(cmdline) => cmdline.join(" "),
Err(_) => "zombie process".into(),
};
if cmdline.is_empty() {
return;
}
let pid_length = 8;
let mut pid = process.pid.to_string();
pid.push_str(&" ".repeat(pid_length - pid.len()));
let padding = " ".repeat(4 * depth);
println!("{}{}{}", pid, padding, cmdline);
let children = get_children(process.pid, all_processes);
for child in &children {
print_process(child, all_processes, depth + 1);
}
}
pub fn get_children(pid: i32, all_processes: &[Process]) -> Vec<&Process> {
all_processes
.iter()
.filter(|process| process.stat.ppid == pid)
.collect()
}