//go:build linux || darwin || freebsd || netbsd || openbsd || aix || solaris package opencode import ( "os/exec" "syscall" ) // setpgid выделяет дочернему процессу собственную process-group, чтобы // killGroup мог убить весь групповой процесс, а не чужой (тест-реннер и т.п.). func setpgid(cmd *exec.Cmd) { cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} } // killGroup шлёт SIGKILL всей process-group процесса (pgid == pid из-за // Setpgid). Процесс уже завершён — возвращаем 0 и не отвлекаемся на ошибку // ESRCH (группа могла сама разойтись). func killGroup(proc *exec.Cmd) { if proc == nil || proc.Process == nil { return } _ = syscall.Kill(-proc.Process.Pid, syscall.SIGKILL) }