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) }