fix(input): zombie process from Action::Spawn

Each invocation of `Action::Spawn` was spawning a process without
waiting on the child; resulting in an accumulation of zombie sh
processes. This will create background threads which waits on the child
to ensure that they are reaped on exit.
This commit is contained in:
Michael Aaron Murphy 2023-05-24 16:12:44 +02:00
parent 70fbad69e6
commit 9d0e1e88ce
No known key found for this signature in database
GPG key ID: B2732D4240C9212C

View file

@ -1137,24 +1137,33 @@ impl State {
workspace.toggle_floating_window(seat);
}
Action::Spawn(command) => {
if let Err(err) = std::process::Command::new("/bin/sh")
.arg("-c")
.arg(command.clone())
.env("WAYLAND_DISPLAY", &self.common.socket)
.env(
"DISPLAY",
&self
.common
.xwayland_state
.as_ref()
.map(|s| format!(":{}", s.display))
.unwrap_or(String::new()),
)
.env_remove("COSMIC_SESSION_SOCK")
.spawn()
{
warn!(?err, "Failed to spawn \"{}\"", command);
}
let wayland_display = self.common.socket.clone();
let display = self
.common
.xwayland_state
.as_ref()
.map(|s| format!(":{}", s.display))
.unwrap_or_default();
std::thread::spawn(move || {
let mut cmd = std::process::Command::new("/bin/sh");
cmd.arg("-c")
.arg(command.clone())
.env("WAYLAND_DISPLAY", &wayland_display)
.env("DISPLAY", &display)
.env_remove("COSMIC_SESSION_SOCK");
match cmd.spawn() {
Ok(mut child) => {
let _res = child.wait();
}
Err(err) => {
tracing::warn!(?err, "Failed to spawn \"{}\"", command);
}
}
});
}
}
}