1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
//go:build aix || android || darwin || dragonfly || freebsd || hurd || illumos || linux || netbsd || openbsd || solaris
// +build aix android darwin dragonfly freebsd hurd illumos linux netbsd openbsd solaris
package process
import (
"syscall"
)
type unixKiller struct {
logger Logger
cmd Commander
}
func newKiller(logger Logger, cmd Commander) killer {
return &unixKiller{
logger: logger,
cmd: cmd,
}
}
func (pk *unixKiller) Terminate() {
if pk.cmd.Process() == nil {
return
}
err := syscall.Kill(pk.getPID(), syscall.SIGTERM)
if err != nil {
pk.logger.Warn("Failed to terminate process:", err)
// try to kill right-after
pk.ForceKill()
}
}
func (pk *unixKiller) ForceKill() {
if pk.cmd.Process() == nil {
return
}
err := syscall.Kill(pk.getPID(), syscall.SIGKILL)
if err != nil {
pk.logger.Warn("Failed to force-kill:", err)
}
}
// getPID will return the negative PID (-PID) which is the process group. The
// negative symbol comes from kill(2) https://linux.die.net/man/2/kill `If pid
// is less than -1, then sig is sent to every process in the process group whose
// ID is -pid.`
func (pk *unixKiller) getPID() int {
return pk.cmd.Process().Pid * -1
}
|