diff options
author | Toby Allen <tobyallen@toflidium.com> | 2019-07-20 17:44:54 +0100 |
---|---|---|
committer | Matt Holt <mholt@users.noreply.github.com> | 2019-07-20 10:44:54 -0600 |
commit | b855e661700fa8f9176f29c3c5b1cebd4cc09351 (patch) | |
tree | b88fcd62af8ba934182b9cdc065b0fe6fb7d9ee2 /cmd | |
parent | 0d3f99e85a089a6a772ae38f426b5cd5f2f4583f (diff) |
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
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/commands.go | 6 | ||||
-rw-r--r-- | cmd/proc_posix.go | 5 | ||||
-rw-r--r-- | cmd/proc_windows.go | 17 |
3 files changed, 24 insertions, 4 deletions
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 +} |