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 |
}
|