Fix args handling for snap entries

This commit is contained in:
Albert Armea 2025-12-28 00:03:50 -05:00
parent d449a7adff
commit 1238987732
2 changed files with 26 additions and 8 deletions

View file

@ -119,9 +119,16 @@ impl HostAdapter for LinuxHost {
(argv.clone(), env.clone(), cwd.clone(), None) (argv.clone(), env.clone(), cwd.clone(), None)
} }
EntryKind::Snap { snap_name, command, args, env } => { EntryKind::Snap { snap_name, command, args, env } => {
// For snap apps, the command defaults to the snap name // For snap apps, we need to use 'snap run <snap_name>' to launch them.
let cmd = command.clone().unwrap_or_else(|| snap_name.clone()); // The command (if specified) is passed as an argument after the snap name,
let mut argv = vec![cmd]; // followed by any additional args.
let mut argv = vec!["snap".to_string(), "run".to_string(), snap_name.clone()];
// If a custom command is specified (different from snap_name), add it
if let Some(cmd) = command {
if cmd != snap_name {
argv.push(cmd.clone());
}
}
argv.extend(args.clone()); argv.extend(args.clone());
(argv, env.clone(), None, Some(snap_name.clone())) (argv, env.clone(), None, Some(snap_name.clone()))
} }
@ -150,7 +157,12 @@ impl HostAdapter for LinuxHost {
}; };
// Get the command name for fallback killing // Get the command name for fallback killing
let command_name = argv.first().cloned().unwrap_or_default(); // For snap apps, use the snap_name (not "snap") to avoid killing unrelated processes
let command_name = if let Some(ref snap) = snap_name {
snap.clone()
} else {
argv.first().cloned().unwrap_or_default()
};
let proc = ManagedProcess::spawn( let proc = ManagedProcess::spawn(
&argv, &argv,

View file

@ -324,8 +324,11 @@ impl ManagedProcess {
/// Send SIGTERM to all processes in this session /// Send SIGTERM to all processes in this session
pub fn terminate(&self) -> HostResult<()> { pub fn terminate(&self) -> HostResult<()> {
// First try to kill by command name - this catches snap apps and re-parented processes // For snap apps, we rely on cgroup-based killing in the adapter, not pkill
kill_by_command(&self.command_name, Signal::SIGTERM); // Using pkill with broad patterns like "snap" would kill unrelated processes
if self.snap_name.is_none() {
kill_by_command(&self.command_name, Signal::SIGTERM);
}
// Also try to kill the process group // Also try to kill the process group
let pgid = Pid::from_raw(-(self.pgid as i32)); // Negative for process group let pgid = Pid::from_raw(-(self.pgid as i32)); // Negative for process group
@ -356,8 +359,11 @@ impl ManagedProcess {
/// Send SIGKILL to all processes in this session /// Send SIGKILL to all processes in this session
pub fn kill(&self) -> HostResult<()> { pub fn kill(&self) -> HostResult<()> {
// First try to kill by command name - this catches snap apps and re-parented processes // For snap apps, we rely on cgroup-based killing in the adapter, not pkill
kill_by_command(&self.command_name, Signal::SIGKILL); // Using pkill with broad patterns like "snap" would kill unrelated processes
if self.snap_name.is_none() {
kill_by_command(&self.command_name, Signal::SIGKILL);
}
// Also try to kill the process group // Also try to kill the process group
let pgid = Pid::from_raw(-(self.pgid as i32)); let pgid = Pid::from_raw(-(self.pgid as i32));