Blame internal/boot/helpers.go

Packit Service 509fd4
// +build integration
Packit Service 509fd4
Packit Service 509fd4
package boot
Packit Service 509fd4
Packit Service 509fd4
import (
Packit Service 509fd4
	"log"
Packit Service 509fd4
	"os"
Packit Service 509fd4
	"syscall"
Packit Service 509fd4
	"time"
Packit Service 509fd4
)
Packit Service 509fd4
Packit Service 509fd4
// durationMin returns the smaller of two given durations
Packit Service 509fd4
func durationMin(a, b time.Duration) time.Duration {
Packit Service 509fd4
	if a < b {
Packit Service 509fd4
		return a
Packit Service 509fd4
	}
Packit Service 509fd4
	return b
Packit Service 509fd4
}
Packit Service 509fd4
Packit Service 509fd4
// killProcessCleanly firstly sends SIGTERM to the process. If it still exists
Packit Service 509fd4
// after the specified timeout, it sends SIGKILL
Packit Service 509fd4
func killProcessCleanly(process *os.Process, timeout time.Duration) error {
Packit Service 509fd4
	err := process.Signal(syscall.SIGTERM)
Packit Service 509fd4
	if err != nil {
Packit Service 509fd4
		log.Printf("cannot send SIGTERM to process, sending SIGKILL instead: %v", err)
Packit Service 509fd4
		return process.Kill()
Packit Service 509fd4
	}
Packit Service 509fd4
Packit Service 509fd4
	const pollInterval = 10 * time.Millisecond
Packit Service 509fd4
Packit Service 509fd4
	for {
Packit Service 509fd4
		p, err := os.FindProcess(process.Pid)
Packit Service 509fd4
		if err != nil {
Packit Service 509fd4
			return nil
Packit Service 509fd4
		}
Packit Service 509fd4
Packit Service 509fd4
		err = p.Signal(syscall.Signal(0))
Packit Service 509fd4
		if err != nil {
Packit Service 509fd4
			return nil
Packit Service 509fd4
		}
Packit Service 509fd4
Packit Service 509fd4
		sleep := durationMin(pollInterval, timeout)
Packit Service 509fd4
		if sleep == 0 {
Packit Service 509fd4
			break
Packit Service 509fd4
		}
Packit Service 509fd4
Packit Service 509fd4
		timeout -= sleep
Packit Service 509fd4
		time.Sleep(sleep)
Packit Service 509fd4
	}
Packit Service 509fd4
Packit Service 509fd4
	return process.Kill()
Packit Service 509fd4
}