mirror of
https://github.com/containers/podman.git
synced 2025-06-22 09:58:10 +08:00
Merge pull request #19703 from baude/stopgvproxyfixups
Fixups for stopping gvproxy
This commit is contained in:
@ -2,7 +2,6 @@ package machine
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
@ -19,7 +18,7 @@ const (
|
|||||||
func backoffForProcess(pid int) error {
|
func backoffForProcess(pid int) error {
|
||||||
sleepInterval := sleepTime
|
sleepInterval := sleepTime
|
||||||
for i := 0; i < loops; i++ {
|
for i := 0; i < loops; i++ {
|
||||||
proxyProc, err := os.FindProcess(pid)
|
proxyProc, err := findProcess(pid)
|
||||||
if proxyProc == nil && err != nil {
|
if proxyProc == nil && err != nil {
|
||||||
// process is killed, gone
|
// process is killed, gone
|
||||||
return nil //nolint: nilerr
|
return nil //nolint: nilerr
|
||||||
@ -35,13 +34,16 @@ func backoffForProcess(pid int) error {
|
|||||||
// process to not exist. if the sigterm does not end the process after an interval,
|
// process to not exist. if the sigterm does not end the process after an interval,
|
||||||
// then sigkill is sent. it also waits for the process to exit after the sigkill too.
|
// then sigkill is sent. it also waits for the process to exit after the sigkill too.
|
||||||
func waitOnProcess(processID int) error {
|
func waitOnProcess(processID int) error {
|
||||||
proxyProc, err := os.FindProcess(processID)
|
proxyProc, err := findProcess(processID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try to kill the pid with sigterm
|
// Try to kill the pid with sigterm
|
||||||
if err := proxyProc.Signal(syscall.SIGTERM); err != nil {
|
if err := proxyProc.Signal(syscall.SIGTERM); err != nil {
|
||||||
|
if err == syscall.ESRCH {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -50,14 +52,16 @@ func waitOnProcess(processID int) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// sigterm has not killed it yet, lets send a sigkill
|
// sigterm has not killed it yet, lets send a sigkill
|
||||||
proxyProc, err = os.FindProcess(processID)
|
proxyProc, err = findProcess(processID)
|
||||||
if proxyProc == nil && err != nil {
|
if proxyProc == nil && err != nil {
|
||||||
// process is killed, gone
|
// process is killed, gone
|
||||||
return nil //nolint: nilerr
|
return nil //nolint: nilerr
|
||||||
}
|
}
|
||||||
if err := proxyProc.Signal(syscall.SIGKILL); err != nil {
|
if err := proxyProc.Signal(syscall.SIGKILL); err != nil {
|
||||||
// lets assume it is dead in this case
|
if err == syscall.ESRCH {
|
||||||
return nil //nolint: nilerr
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
return backoffForProcess(processID)
|
return backoffForProcess(processID)
|
||||||
}
|
}
|
||||||
@ -72,8 +76,8 @@ func CleanupGVProxy(f VMFile) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("unable to convert pid to integer: %v", err)
|
return fmt.Errorf("unable to convert pid to integer: %v", err)
|
||||||
}
|
}
|
||||||
if err := waitOnProcess(proxyPid); err == nil {
|
if err := waitOnProcess(proxyPid); err != nil {
|
||||||
return nil
|
return err
|
||||||
}
|
}
|
||||||
return f.Delete()
|
return f.Delete()
|
||||||
}
|
}
|
||||||
|
24
pkg/machine/gvproxy_unix.go
Normal file
24
pkg/machine/gvproxy_unix.go
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
//go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd
|
||||||
|
// +build darwin dragonfly freebsd linux netbsd openbsd
|
||||||
|
|
||||||
|
package machine
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
func findProcess(pid int) (*os.Process, error) {
|
||||||
|
p, err := os.FindProcess(pid)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
// On unix, findprocess will always return a process even
|
||||||
|
// if the process is not found. you must send a 0 signal
|
||||||
|
// to the process to see if it is alive.
|
||||||
|
// https://pkg.go.dev/os#FindProcess
|
||||||
|
if err := p.Signal(syscall.Signal(0)); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return p, nil
|
||||||
|
}
|
10
pkg/machine/gvproxy_windows.go
Normal file
10
pkg/machine/gvproxy_windows.go
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
//go:build windows
|
||||||
|
// +build windows
|
||||||
|
|
||||||
|
package machine
|
||||||
|
|
||||||
|
import "os"
|
||||||
|
|
||||||
|
func findProcess(pid int) (*os.Process, error) {
|
||||||
|
return os.FindProcess(pid)
|
||||||
|
}
|
Reference in New Issue
Block a user