Skip to content

Commit 5d076fd

Browse files
committed
Process-kill now terminate process group on MacOSX
1 parent 73c658f commit 5d076fd

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

process_darwin.go

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
//
2+
// This file is part of PathsHelper library.
3+
//
4+
// Copyright 2023 Arduino AG (http://www.arduino.cc/)
5+
//
6+
// PathsHelper library is free software; you can redistribute it and/or modify
7+
// it under the terms of the GNU General Public License as published by
8+
// the Free Software Foundation; either version 2 of the License, or
9+
// (at your option) any later version.
10+
//
11+
// This program is distributed in the hope that it will be useful,
12+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
// GNU General Public License for more details.
15+
//
16+
// You should have received a copy of the GNU General Public License
17+
// along with this program; if not, write to the Free Software
18+
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19+
//
20+
// As a special exception, you may use this file as part of a free software
21+
// library without restriction. Specifically, if other files instantiate
22+
// templates or use macros or inline functions from this file, or you compile
23+
// this file and link it with other files to produce an executable, this
24+
// file does not by itself cause the resulting executable to be covered by
25+
// the GNU General Public License. This exception does not however
26+
// invalidate any other reasons why the executable file might be covered by
27+
// the GNU General Public License.
28+
//
29+
30+
package paths
31+
32+
import (
33+
"os/exec"
34+
"syscall"
35+
)
36+
37+
func tellCommandNotToSpawnShell(_ *exec.Cmd) {
38+
// no op
39+
}
40+
41+
func tellCommandToStartOnNewProcessGroup(oscmd *exec.Cmd) {
42+
// https://groups.google.com/g/golang-nuts/c/XoQ3RhFBJl8
43+
44+
// Start the process in a new process group.
45+
// This is needed to kill the process and its children
46+
// if we need to kill the process.
47+
if oscmd.SysProcAttr == nil {
48+
oscmd.SysProcAttr = &syscall.SysProcAttr{}
49+
}
50+
oscmd.SysProcAttr.Setpgid = true
51+
}
52+
53+
func kill(oscmd *exec.Cmd) error {
54+
// https://groups.google.com/g/golang-nuts/c/XoQ3RhFBJl8
55+
56+
// Kill the process group
57+
pgid, err := syscall.Getpgid(oscmd.Process.Pid)
58+
if err != nil {
59+
return err
60+
}
61+
return syscall.Kill(-pgid, syscall.SIGKILL)
62+
}

process_others.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
// the GNU General Public License.
2828
//
2929

30-
//go:build !windows && !linux
30+
//go:build !windows && !linux && !darwin
3131

3232
package paths
3333

0 commit comments

Comments
 (0)