diff --git a/internal/mcp/bash.go b/internal/mcp/bash.go index b67f4b2..740bf16 100644 --- a/internal/mcp/bash.go +++ b/internal/mcp/bash.go @@ -11,7 +11,6 @@ import ( "os/exec" "path/filepath" "regexp" - "runtime" "strings" "sync" "syscall" @@ -430,9 +429,7 @@ func (s *BashServer) runBackgroundJob(ctx context.Context, command string, timeo jobID := s.jobTracker.Add(job) cmd := exec.CommandContext(jobCtx, "sh", "-c", command) - if runtime.GOOS != "windows" { - cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} - } + setProcessGroup(cmd) if workingDir != "" { cmd.Dir = workingDir } diff --git a/internal/mcp/bash_unix.go b/internal/mcp/bash_unix.go index 4a9f3e6..d0af812 100644 --- a/internal/mcp/bash_unix.go +++ b/internal/mcp/bash_unix.go @@ -32,6 +32,13 @@ func killProcessGroup(targetPID int, removeTracking func()) (string, error) { return "", nil } +func setProcessGroup(cmd *exec.Cmd) { + if cmd == nil { + return + } + cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} +} + // GetUnixTools returns the list of tools that are only available on Unix systems (mac, linux) func GetUnixTools() []Tool { return []Tool{ diff --git a/internal/mcp/bash_windows.go b/internal/mcp/bash_windows.go index e20a961..3bed278 100644 --- a/internal/mcp/bash_windows.go +++ b/internal/mcp/bash_windows.go @@ -7,6 +7,7 @@ import ( "errors" "fmt" "os" + "os/exec" "syscall" ) @@ -28,6 +29,16 @@ func killProcessGroup(targetPID int, removeTracking func()) (string, error) { return fmt.Sprintf("Killed process %d", targetPID), nil } +func setProcessGroup(cmd *exec.Cmd) { + if cmd == nil { + return + } + if cmd.SysProcAttr == nil { + cmd.SysProcAttr = &syscall.SysProcAttr{} + } + cmd.SysProcAttr.CreationFlags |= syscall.CREATE_NEW_PROCESS_GROUP +} + // GetUnixTools returns an empty list on Windows (not supported) func GetUnixTools() []Tool {