Browse Source

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
master
Toby Allen 6 years ago
committed by Matt Holt
parent
commit
b855e66170
  1. 6
      cmd/commands.go
  2. 5
      cmd/proc_posix.go
  3. 17
      cmd/proc_windows.go

6
cmd/commands.go

@ -27,7 +27,7 @@ import (
"net/http" "net/http"
"os" "os"
"os/exec" "os/exec"
"path/filepath"
"strings" "strings"
"github.com/caddyserver/caddy/v2" "github.com/caddyserver/caddy/v2"
@ -203,14 +203,14 @@ func cmdStop() (int, error) {
if err != nil { if err != nil {
return caddy.ExitCodeFailedStartup, fmt.Errorf("listing processes: %v", err) return caddy.ExitCodeFailedStartup, fmt.Errorf("listing processes: %v", err)
} }
thisProcName := filepath.Base(os.Args[0]) thisProcName := getProcessName()
var found bool var found bool
for _, p := range processList { for _, p := range processList {
// the process we're looking for should have the same name but different PID // the process we're looking for should have the same name but different PID
if p.Executable() == thisProcName && p.Pid() != os.Getpid() { if p.Executable() == thisProcName && p.Pid() != os.Getpid() {
found = true found = true
fmt.Printf("pid=%d\n", p.Pid()) fmt.Printf("pid=%d\n", p.Pid())
fmt.Printf("Graceful stop...")
if err := gracefullyStopProcess(p.Pid()); err != nil { if err := gracefullyStopProcess(p.Pid()); err != nil {
return caddy.ExitCodeFailedStartup, err return caddy.ExitCodeFailedStartup, err
} }

5
cmd/proc_posix.go

@ -22,9 +22,14 @@ import (
) )
func gracefullyStopProcess(pid int) error { func gracefullyStopProcess(pid int) error {
fmt.Printf("Graceful stop...")
err := syscall.Kill(pid, syscall.SIGINT) err := syscall.Kill(pid, syscall.SIGINT)
if err != nil { if err != nil {
return fmt.Errorf("kill: %v", err) return fmt.Errorf("kill: %v", err)
} }
return nil return nil
} }
func getProcessName() string {
return filepath.Base(os.Args[0])
}

17
cmd/proc_windows.go

@ -16,14 +16,29 @@ package caddycmd
import ( import (
"fmt" "fmt"
"os"
"os/exec" "os/exec"
"path/filepath"
"strconv" "strconv"
) )
func gracefullyStopProcess(pid int) error { 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 { if err := cmd.Run(); err != nil {
return fmt.Errorf("taskkill: %v", err) return fmt.Errorf("taskkill: %v", err)
} }
return nil 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
}

Loading…
Cancel
Save