mirror of
https://github.com/samsonjs/vibetunnel.git
synced 2026-04-27 15:17:38 +00:00
Add a way to kill a process
This commit is contained in:
parent
a6fb6ca6c0
commit
fdd6c33289
1 changed files with 74 additions and 0 deletions
|
|
@ -161,6 +161,37 @@ fn cleanup_session(control_path: &Path, session_id: &str) -> Result<bool, anyhow
|
||||||
Ok(true)
|
Ok(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn send_signal_to_session(
|
||||||
|
control_path: &Path,
|
||||||
|
session_id: &str,
|
||||||
|
signal: i32,
|
||||||
|
) -> Result<(), anyhow::Error> {
|
||||||
|
let session_path = control_path.join(session_id);
|
||||||
|
let session_json_path = session_path.join("session.json");
|
||||||
|
|
||||||
|
if !session_json_path.exists() {
|
||||||
|
return Err(anyhow!("Session {} not found", session_id));
|
||||||
|
}
|
||||||
|
|
||||||
|
let content = fs::read_to_string(&session_json_path)?;
|
||||||
|
let session_info: SessionInfo = serde_json::from_str(&content)?;
|
||||||
|
|
||||||
|
if let Some(pid) = session_info.pid {
|
||||||
|
if is_pid_alive(pid) {
|
||||||
|
let result = unsafe { libc::kill(pid as i32, signal) };
|
||||||
|
if result == 0 {
|
||||||
|
Ok(())
|
||||||
|
} else {
|
||||||
|
Err(anyhow!("Failed to send signal {} to PID {}", signal, pid))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Err(anyhow!("Session {} process (PID: {}) is not running", session_id, pid))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Err(anyhow!("Session {} has no PID recorded", session_id))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn cleanup_sessions(
|
fn cleanup_sessions(
|
||||||
control_path: &Path,
|
control_path: &Path,
|
||||||
specific_session: Option<&str>,
|
specific_session: Option<&str>,
|
||||||
|
|
@ -221,6 +252,9 @@ fn main() -> Result<(), anyhow::Error> {
|
||||||
let mut session_id = None::<String>;
|
let mut session_id = None::<String>;
|
||||||
let mut send_key = None::<String>;
|
let mut send_key = None::<String>;
|
||||||
let mut send_text = None::<String>;
|
let mut send_text = None::<String>;
|
||||||
|
let mut signal = None::<i32>;
|
||||||
|
let mut stop = false;
|
||||||
|
let mut kill = false;
|
||||||
let mut cleanup = false;
|
let mut cleanup = false;
|
||||||
let mut cmdline = Vec::<OsString>::new();
|
let mut cmdline = Vec::<OsString>::new();
|
||||||
|
|
||||||
|
|
@ -244,6 +278,16 @@ fn main() -> Result<(), anyhow::Error> {
|
||||||
p if p.is_long("send-text") => {
|
p if p.is_long("send-text") => {
|
||||||
send_text = Some(parser.value()?);
|
send_text = Some(parser.value()?);
|
||||||
}
|
}
|
||||||
|
p if p.is_long("signal") => {
|
||||||
|
let signal_str: String = parser.value()?;
|
||||||
|
signal = Some(signal_str.parse().map_err(|_| anyhow!("Invalid signal number: {}", signal_str))?);
|
||||||
|
}
|
||||||
|
p if p.is_long("stop") => {
|
||||||
|
stop = true;
|
||||||
|
}
|
||||||
|
p if p.is_long("kill") => {
|
||||||
|
kill = true;
|
||||||
|
}
|
||||||
p if p.is_long("cleanup") => {
|
p if p.is_long("cleanup") => {
|
||||||
cleanup = true;
|
cleanup = true;
|
||||||
}
|
}
|
||||||
|
|
@ -260,6 +304,9 @@ fn main() -> Result<(), anyhow::Error> {
|
||||||
println!(" --send-key <key> Send key input to session");
|
println!(" --send-key <key> Send key input to session");
|
||||||
println!(" Keys: arrow_up, arrow_down, arrow_left, arrow_right, escape, enter");
|
println!(" Keys: arrow_up, arrow_down, arrow_left, arrow_right, escape, enter");
|
||||||
println!(" --send-text <text> Send text input to session");
|
println!(" --send-text <text> Send text input to session");
|
||||||
|
println!(" --signal <number> Send signal number to session PID");
|
||||||
|
println!(" --stop Send SIGTERM to session (equivalent to --signal 15)");
|
||||||
|
println!(" --kill Send SIGKILL to session (equivalent to --signal 9)");
|
||||||
println!(" --cleanup Remove exited sessions (all if no --session specified)");
|
println!(" --cleanup Remove exited sessions (all if no --session specified)");
|
||||||
println!(" --help Show this help message");
|
println!(" --help Show this help message");
|
||||||
return Ok(());
|
return Ok(());
|
||||||
|
|
@ -286,6 +333,33 @@ fn main() -> Result<(), anyhow::Error> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Handle signal command
|
||||||
|
if let Some(sig) = signal {
|
||||||
|
if let Some(sid) = &session_id {
|
||||||
|
return send_signal_to_session(&control_path, sid, sig);
|
||||||
|
} else {
|
||||||
|
return Err(anyhow!("--signal requires --session <session_id>"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle stop command (SIGTERM)
|
||||||
|
if stop {
|
||||||
|
if let Some(sid) = &session_id {
|
||||||
|
return send_signal_to_session(&control_path, sid, 15);
|
||||||
|
} else {
|
||||||
|
return Err(anyhow!("--stop requires --session <session_id>"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle kill command (SIGKILL)
|
||||||
|
if kill {
|
||||||
|
if let Some(sid) = &session_id {
|
||||||
|
return send_signal_to_session(&control_path, sid, 9);
|
||||||
|
} else {
|
||||||
|
return Err(anyhow!("--kill requires --session <session_id>"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Handle cleanup command
|
// Handle cleanup command
|
||||||
if cleanup {
|
if cleanup {
|
||||||
return cleanup_sessions(&control_path, session_id.as_deref());
|
return cleanup_sessions(&control_path, session_id.as_deref());
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue