sysutils: basic ps utility
This commit is contained in:
parent
1b2b41406a
commit
6f8fce3388
@ -133,6 +133,10 @@ path = "src/sleep.rs"
|
|||||||
name = "lspci"
|
name = "lspci"
|
||||||
path = "src/lspci.rs"
|
path = "src/lspci.rs"
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "ps"
|
||||||
|
path = "src/ps.rs"
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "tst"
|
name = "tst"
|
||||||
path = "src/tst.rs"
|
path = "src/tst.rs"
|
||||||
|
60
userspace/sysutils/src/ps.rs
Normal file
60
userspace/sysutils/src/ps.rs
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
use std::{fs, io, path::PathBuf, process::ExitCode};
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct ProcessInfo {
|
||||||
|
pid: u32,
|
||||||
|
name: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn list_processes() -> io::Result<Vec<u32>> {
|
||||||
|
let mut list = vec![];
|
||||||
|
for entry in fs::read_dir("/sys/proc")? {
|
||||||
|
let Ok(entry) = entry else {
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
let filename = entry.file_name();
|
||||||
|
let Some(name) = filename.to_str() else {
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
let Ok(pid) = name.parse() else {
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
list.push(pid);
|
||||||
|
}
|
||||||
|
Ok(list)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn process_info(pid: u32) -> io::Result<ProcessInfo> {
|
||||||
|
let base = PathBuf::from("/sys/proc").join(format!("{pid}"));
|
||||||
|
let name = fs::read_to_string(base.join("name"))?;
|
||||||
|
Ok(ProcessInfo { pid, name })
|
||||||
|
}
|
||||||
|
|
||||||
|
fn processes() -> io::Result<Vec<ProcessInfo>> {
|
||||||
|
let pids = list_processes()?;
|
||||||
|
let processes = pids
|
||||||
|
.into_iter()
|
||||||
|
.filter_map(|pid| process_info(pid).ok())
|
||||||
|
.collect();
|
||||||
|
Ok(processes)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run() -> io::Result<()> {
|
||||||
|
let mut processes = processes()?;
|
||||||
|
processes.sort_by(|a, b| Ord::cmp(&a.pid, &b.pid));
|
||||||
|
println!("{:>4} NAME", "PID");
|
||||||
|
for process in processes {
|
||||||
|
println!("{:4} {}", process.pid, process.name.trim());
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() -> ExitCode {
|
||||||
|
match run() {
|
||||||
|
Ok(()) => ExitCode::SUCCESS,
|
||||||
|
Err(error) => {
|
||||||
|
eprintln!("{error}");
|
||||||
|
ExitCode::FAILURE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -48,6 +48,7 @@ const PROGRAMS: &[(&str, &str)] = &[
|
|||||||
("sync", "bin/sync"),
|
("sync", "bin/sync"),
|
||||||
("sleep", "bin/sleep"),
|
("sleep", "bin/sleep"),
|
||||||
("lspci", "bin/lspci"),
|
("lspci", "bin/lspci"),
|
||||||
|
("ps", "bin/ps"),
|
||||||
("tst", "bin/tst"),
|
("tst", "bin/tst"),
|
||||||
// netutils
|
// netutils
|
||||||
("netconf", "sbin/netconf"),
|
("netconf", "sbin/netconf"),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user