Skip to main content

power_rules_daemon/
process.rs

1//! Process detection using procfs (no pgrep dependency)
2
3use procfs::process::all_processes;
4use anyhow::{Context, Result};
5
6/// Checks if a process is running by searching command lines (like pgrep -f)
7pub fn is_process_running(process_name: &str) -> bool {
8    match try_is_process_running(process_name) {
9        Ok(running) => running,
10        Err(e) => {
11            eprintln!("Process check error: {}", e);
12            false
13        }
14    }
15}
16
17/// Inner function that returns Result for proper error handling
18fn try_is_process_running(process_name: &str) -> Result<bool> {
19    let processes = all_processes().context("Failed to list processes")?;
20
21    for process in processes {
22        let process = process.context("Failed to read process info")?;
23
24        // Check the process name (from stat)
25        if let Ok(stat) = process.stat() {
26            if stat.comm.contains(process_name) {
27                return Ok(true);
28            }
29        }
30
31        // Check full command line
32        if let Ok(cmdline) = process.cmdline() {
33            if cmdline.iter().any(|arg| arg.contains(process_name)) {
34                return Ok(true);
35            }
36        }
37    }
38
39    Ok(false)
40}