diff --git a/src/go/rdctl/cmd/internalProcessWaitKill.go b/src/go/rdctl/cmd/internalProcessWaitKill.go index b581d21086f..b4a29109fc1 100644 --- a/src/go/rdctl/cmd/internalProcessWaitKill.go +++ b/src/go/rdctl/cmd/internalProcessWaitKill.go @@ -20,7 +20,11 @@ limitations under the License. package cmd import ( + "errors" "fmt" + "os" + "runtime" + "syscall" "github.com/rancher-sandbox/rancher-desktop/src/go/rdctl/pkg/process" "github.com/spf13/cobra" @@ -39,6 +43,20 @@ exit, and once it does, terminates all processes within the same process group.` if err != nil { return fmt.Errorf("failed to get process ID: %w", err) } + if runtime.GOOS == "linux" { + // TODO: We can't use the process group on Linux, because Electron does + // not always create a new one. + proc, err := os.FindProcess(pid) + if err != nil { + return fmt.Errorf("failed to find process for pid %d: %w", pid, err) + } + // The pid might not exist even if we did not receive an error. + err = proc.Signal(syscall.SIGTERM) + if err != nil && !errors.Is(err, os.ErrProcessDone) { + return fmt.Errorf("failed to terminate process %d: %w", pid, err) + } + return nil + } return process.KillProcessGroup(pid, true) }, } diff --git a/src/go/rdctl/pkg/shutdown/shutdown.go b/src/go/rdctl/pkg/shutdown/shutdown.go index 9c048e9255e..2e4a3f02618 100644 --- a/src/go/rdctl/pkg/shutdown/shutdown.go +++ b/src/go/rdctl/pkg/shutdown/shutdown.go @@ -237,17 +237,21 @@ func terminateRancherDesktopFunc(appDir string) func(context.Context) error { return func(ctx context.Context) error { var errors *multierror.Error - errors = multierror.Append(errors, (func() error { - mainExe, err := p.GetMainExecutable(ctx) - if err != nil { - return err - } - pid, err := process.FindPidOfProcess(mainExe) - if err != nil { - return err - } - return process.KillProcessGroup(pid, false) - })()) + // TODO: We can't use the process group on Linux, because Electron does + // not always create a new one. + if runtime.GOOS != "linux" { + errors = multierror.Append(errors, (func() error { + mainExe, err := p.GetMainExecutable(ctx) + if err != nil { + return err + } + pid, err := process.FindPidOfProcess(mainExe) + if err != nil { + return err + } + return process.KillProcessGroup(pid, false) + })()) + } errors = multierror.Append(errors, process.TerminateProcessInDirectory(appDir, true))