2026-07-11 13:16:10 +07:00
|
|
|
use std::collections::HashMap;
|
|
|
|
|
use std::sync::Mutex;
|
|
|
|
|
use std::sync::OnceLock;
|
|
|
|
|
|
|
|
|
|
use super::job::BashJob;
|
|
|
|
|
|
|
|
|
|
pub(crate) fn bash_jobs_map() -> &'static Mutex<HashMap<String, BashJob>> {
|
|
|
|
|
static JOBS: OnceLock<Mutex<HashMap<String, BashJob>>> = OnceLock::new();
|
|
|
|
|
JOBS.get_or_init(|| Mutex::new(HashMap::new()))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn bash_output(id: &str) -> Option<Vec<String>> {
|
|
|
|
|
let mut map = bash_jobs_map().lock().ok()?;
|
|
|
|
|
let job = map.get_mut(id)?;
|
|
|
|
|
let mut lines = Vec::new();
|
|
|
|
|
while let Some(line) = job.try_read_line() {
|
|
|
|
|
lines.push(line);
|
|
|
|
|
}
|
|
|
|
|
if lines.is_empty() { None } else { Some(lines) }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn bash_kill(id: &str) -> anyhow::Result<()> {
|
|
|
|
|
let mut map = bash_jobs_map().lock().map_err(|e| anyhow::anyhow!("lock error: {}", e))?;
|
|
|
|
|
let job = map.remove(id);
|
2026-07-12 03:14:52 +07:00
|
|
|
match job {
|
|
|
|
|
Some(job) => {
|
|
|
|
|
// Actually terminate the child process via its PID
|
|
|
|
|
if job.child_pid > 0 {
|
|
|
|
|
#[cfg(unix)]
|
|
|
|
|
unsafe {
|
|
|
|
|
libc::kill(job.child_pid as i32, libc::SIGTERM);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
None => anyhow::bail!("bash job '{}' not found", id),
|
2026-07-11 13:16:10 +07:00
|
|
|
}
|
|
|
|
|
}
|