From b855e661700fa8f9176f29c3c5b1cebd4cc09351 Mon Sep 17 00:00:00 2001 From: Toby Allen Date: Sat, 20 Jul 2019 17:44:54 +0100 Subject: Force quit on Windows with taskkill /f (#2670) * Force quit /f on windows, also check for processname '.exe' on windows. * Remove unneeded spaces * fix tabs * go fmt tabs * Return consistent appname which always includes .exe * Change func name --- cmd/commands.go | 6 +++--- cmd/proc_posix.go | 5 +++++ cmd/proc_windows.go | 17 ++++++++++++++++- 3 files changed, 24 insertions(+), 4 deletions(-) (limited to 'cmd') diff --git a/cmd/commands.go b/cmd/commands.go index 072c1d4..e63e2d5 100644 --- a/cmd/commands.go +++ b/cmd/commands.go @@ -27,7 +27,7 @@ import ( "net/http" "os" "os/exec" - "path/filepath" + "strings" "github.com/caddyserver/caddy/v2" @@ -203,14 +203,14 @@ func cmdStop() (int, error) { if err != nil { return caddy.ExitCodeFailedStartup, fmt.Errorf("listing processes: %v", err) } - thisProcName := filepath.Base(os.Args[0]) + thisProcName := getProcessName() var found bool for _, p := range processList { // the process we're looking for should have the same name but different PID if p.Executable() == thisProcName && p.Pid() != os.Getpid() { found = true fmt.Printf("pid=%d\n", p.Pid()) - fmt.Printf("Graceful stop...") + if err := gracefullyStopProcess(p.Pid()); err != nil { return caddy.ExitCodeFailedStartup, err } diff --git a/cmd/proc_posix.go b/cmd/proc_posix.go index 2cb4b9a..da586e0 100644 --- a/cmd/proc_posix.go +++ b/cmd/proc_posix.go @@ -22,9 +22,14 @@ import ( ) func gracefullyStopProcess(pid int) error { + fmt.Printf("Graceful stop...") err := syscall.Kill(pid, syscall.SIGINT) if err != nil { return fmt.Errorf("kill: %v", err) } return nil } + +func getProcessName() string { + return filepath.Base(os.Args[0]) +} diff --git a/cmd/proc_windows.go b/cmd/proc_windows.go index 27fbdeb..d333948 100644 --- a/cmd/proc_windows.go +++ b/cmd/proc_windows.go @@ -16,14 +16,29 @@ package caddycmd import ( "fmt" + "os" "os/exec" + "path/filepath" "strconv" ) func gracefullyStopProcess(pid int) error { - cmd := exec.Command("taskkill", "/pid", strconv.Itoa(pid)) + fmt.Printf("Forceful Stop...") + // process on windows will not stop unless forced with /f + cmd := exec.Command("taskkill", "/pid", strconv.Itoa(pid), "/f") if err := cmd.Run(); err != nil { return fmt.Errorf("taskkill: %v", err) } return nil } + +// On Windows the app name passed in os.Args[0] will match how +// caddy was started eg will match caddy or caddy.exe. +// So return appname with .exe for consistency +func getProcessName() string { + base := filepath.Base(os.Args[0]) + if filepath.Ext(base) == "" { + return base + ".exe" + } + return base +} -- cgit v1.2.3