pub mod model;
use anyhow::{Context, Result};
use clap::Parser;
use log::debug;
use model::get_memory;
use owo_colors::OwoColorize;
use procfs::process::Process;
use procfs::{page_size, ticks_per_second, CpuInfo, Current, Uptime};
#[derive(Parser, Debug)]
#[command(version, about, long_about = None)]
struct Args {
#[arg(long)]
pid: i32,
}
#[allow(dead_code)]
fn main() -> Result<()> {
let args = Args::parse();
let pid = args.pid;
debug!("Checking pid {}...", pid);
let process = Process::new(pid).with_context(|| format!("Pid {pid} not found."))?;
let stat = process.stat().unwrap();
debug!("ticks per second: {}", ticks_per_second());
debug!("pagesize: {}", page_size());
let usage = stat.utime / ticks_per_second() + stat.stime / ticks_per_second();
debug!("usage {} ", usage);
let uptime = Uptime::current().unwrap().uptime_duration().as_secs();
debug!("Uptime: {}", uptime);
let starttime = stat.starttime / ticks_per_second();
debug!("Starttime: {}", starttime);
let runtime = uptime - starttime;
debug!("runtime: {}", runtime);
let num_cores = CpuInfo::current().unwrap().num_cores();
debug!("num cores: {}", num_cores);
let percentage = usage as f64 * 100.0 / runtime as f64 / num_cores as f64;
let memory = get_memory(&process);
println!(
"Process {} ({}) has used {:.2}% of the cpu and is using {} bytes of memory.",
stat.comm.green(),
pid.yellow(),
percentage.yellow(),
memory.yellow(),
);
Ok(())
}
#[derive(Debug)]
struct ProcessbarError(String);