diff --git a/crates/terminal/src/pty_info.rs b/crates/terminal/src/pty_info.rs index 7b6676760ca61c1cfde22601d0c0eb0b9641b42a..4e16d69e40553c359056934a4b49b2955a017ab5 100644 --- a/crates/terminal/src/pty_info.rs +++ b/crates/terminal/src/pty_info.rs @@ -157,6 +157,17 @@ impl PtyProcessInfo { self.get_child().is_some_and(|process| process.kill()) } + #[cfg(unix)] + pub(crate) fn terminate_child_process(&self) -> bool { + let pid = self.pid_getter.fallback_pid(); + unsafe { libc::killpg(pid.as_u32() as i32, libc::SIGTERM) == 0 } + } + + #[cfg(not(unix))] + pub(crate) fn terminate_child_process(&self) -> bool { + false + } + fn load(&self) -> Option { let process = self.refresh()?; let cwd = process.cwd().map_or(PathBuf::new(), |p| p.to_owned()); diff --git a/crates/terminal/src/terminal.rs b/crates/terminal/src/terminal.rs index b620f5f03c2debf19cdc4856da8c039fe690651f..74118d372d91cf99714dfeecb63e6b6b24e18c41 100644 --- a/crates/terminal/src/terminal.rs +++ b/crates/terminal/src/terminal.rs @@ -2424,6 +2424,7 @@ impl Drop for Terminal { std::mem::replace(&mut self.terminal_type, TerminalType::DisplayOnly) { pty_tx.0.send(Msg::Shutdown).ok(); + info.terminate_child_process(); let timer = self.background_executor.timer(Duration::from_millis(100)); self.background_executor