From 3c2012f97accf0f9d81e2a1b2e5fbdfa8fb87799 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Wed, 3 Apr 2019 13:39:20 +0200 Subject: [PATCH] src/tools/procfs.rs: start helper tools to read procfs --- src/tools.rs | 1 + src/tools/procfs.rs | 48 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 src/tools/procfs.rs diff --git a/src/tools.rs b/src/tools.rs index 156ba1f7..90499644 100644 --- a/src/tools.rs +++ b/src/tools.rs @@ -31,6 +31,7 @@ pub mod fs; pub mod tty; pub mod signalfd; pub mod daemon; +pub mod procfs; mod process_locker; pub use process_locker::*; diff --git a/src/tools/procfs.rs b/src/tools/procfs.rs new file mode 100644 index 00000000..9187096d --- /dev/null +++ b/src/tools/procfs.rs @@ -0,0 +1,48 @@ +use failure::*; + +use crate::tools; +use lazy_static::lazy_static; +use regex::Regex; + +pub struct ProcFsPidStat { + pub status: u8, + pub utime: u64, + pub stime: u64, + pub starttime: u64, + pub vsize: u64, + pub rss: i64, +} + +pub fn read_proc_pid_stat(pid: nix::unistd::Pid) -> Result { + + let statstr = tools::file_read_firstline(format!("/proc/{}/stat", pid))?; + + lazy_static! { + static ref REGEX: Regex = Regex::new(r"^(?P\d+) \(.*\) (?P\S) -?\d+ -?\d+ -?\d+ -?\d+ -?\d+ \d+ \d+ \d+ \d+ \d+ (?P\d+) (?P\d+) -?\d+ -?\d+ -?\d+ -?\d+ -?\d+ 0 (?P\d+) (?P\d+) (?P-?\d+) \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ -?\d+ -?\d+ \d+ \d+ \d+").unwrap(); + } + + if let Some(cap) = REGEX.captures(&statstr) { + if pid != nix::unistd::Pid::from_raw(cap["pid"].parse::().unwrap()) { + bail!("unable to read pid stat for process '{}' - got wrong pid", pid); + } + + return Ok(ProcFsPidStat { + status: cap["status"].as_bytes()[0], + utime: cap["utime"].parse::().unwrap(), + stime: cap["stime"].parse::().unwrap(), + starttime: cap["starttime"].parse::().unwrap(), + vsize: cap["vsize"].parse::().unwrap(), + rss: cap["rss"].parse::().unwrap() * 4096, + }); + + } + + bail!("unable to read pid stat for process '{}'", pid); +} + +pub fn read_proc_starttime(pid: nix::unistd::Pid) -> Result { + + let info = read_proc_pid_stat(pid)?; + + Ok(info.starttime) +}