Some checks are pending
Rhai Tests / Run Rhai Tests (push) Waiting to run
- Add `sal-process` package for cross-platform process management. - Update workspace members in `Cargo.toml`. - Mark process package as complete in MONOREPO_CONVERSION_PLAN.md - Remove license information from `mycelium` and `os` READMEs.
50 lines
1.3 KiB
Rust
50 lines
1.3 KiB
Rust
use crate::run_command;
|
|
use anyhow::Result;
|
|
use std::fs;
|
|
|
|
/// Executes a command in a new screen session.
|
|
///
|
|
/// # Arguments
|
|
///
|
|
/// * `name` - The name of the screen session.
|
|
/// * `cmd` - The command to execute.
|
|
///
|
|
/// # Returns
|
|
///
|
|
/// * `Result<()>` - Ok if the command was executed successfully, otherwise an error.
|
|
pub fn new(name: &str, cmd: &str) -> Result<()> {
|
|
let script_path = format!("/tmp/cmd_{}.sh", name);
|
|
let mut script_content = String::new();
|
|
|
|
if !cmd.starts_with("#!") {
|
|
script_content.push_str("#!/bin/bash\n");
|
|
}
|
|
|
|
script_content.push_str("set -e\n");
|
|
script_content.push_str(cmd);
|
|
|
|
fs::write(&script_path, script_content)?;
|
|
fs::set_permissions(&script_path, std::os::unix::fs::PermissionsExt::from_mode(0o755))?;
|
|
|
|
let screen_cmd = format!("screen -d -m -S {} {}", name, script_path);
|
|
run_command(&screen_cmd)?;
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// Kills a screen session.
|
|
///
|
|
/// # Arguments
|
|
///
|
|
/// * `name` - The name of the screen session to kill.
|
|
///
|
|
/// # Returns
|
|
///
|
|
/// * `Result<()>` - Ok if the session was killed successfully, otherwise an error.
|
|
pub fn kill(name: &str) -> Result<()> {
|
|
let cmd = format!("screen -S {} -X quit", name);
|
|
run_command(&cmd)?;
|
|
std::thread::sleep(std::time::Duration::from_millis(500));
|
|
Ok(())
|
|
}
|