fix(gateway): support stop command for externally-started gateway
When gateway is started externally and the web handler attaches to it via PID file, the stop command incorrectly returned "not_running" because it only checked gateway.cmd (which is nil for attached gateways). Now handles both cases: 1. Gateway started by handler: uses gateway.cmd.Process 2. Gateway started externally: uses gateway.pidData.PID with os.FindProcess Fixes #2373 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
1da76b26c6
commit
78f8b7a0c4
1 changed files with 25 additions and 11 deletions
|
|
@ -452,19 +452,32 @@ func (h *Handler) StopGateway() {
|
||||||
// Assumes gateway.mu is held by the caller.
|
// Assumes gateway.mu is held by the caller.
|
||||||
// Returns the PID of the stopped process and any error encountered.
|
// Returns the PID of the stopped process and any error encountered.
|
||||||
func stopGatewayLocked() (int, error) {
|
func stopGatewayLocked() (int, error) {
|
||||||
if gateway.cmd == nil || gateway.cmd.Process == nil {
|
var pid int
|
||||||
return 0, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
pid := gateway.cmd.Process.Pid
|
|
||||||
|
|
||||||
// Send SIGTERM for graceful shutdown (SIGKILL on Windows)
|
|
||||||
var sigErr error
|
var sigErr error
|
||||||
|
|
||||||
|
if gateway.cmd != nil && gateway.cmd.Process != nil {
|
||||||
|
// Gateway was started by us - use the cmd process
|
||||||
|
pid = gateway.cmd.Process.Pid
|
||||||
if runtime.GOOS == "windows" {
|
if runtime.GOOS == "windows" {
|
||||||
sigErr = gateway.cmd.Process.Kill()
|
sigErr = gateway.cmd.Process.Kill()
|
||||||
} else {
|
} else {
|
||||||
sigErr = gateway.cmd.Process.Signal(syscall.SIGTERM)
|
sigErr = gateway.cmd.Process.Signal(syscall.SIGTERM)
|
||||||
}
|
}
|
||||||
|
} else if gateway.pidData != nil && gateway.pidData.PID > 0 {
|
||||||
|
// Gateway was started externally and we attached to it - use os.FindProcess
|
||||||
|
pid = gateway.pidData.PID
|
||||||
|
proc, err := os.FindProcess(pid)
|
||||||
|
if err != nil {
|
||||||
|
return pid, fmt.Errorf("failed to find process: %w", err)
|
||||||
|
}
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
sigErr = proc.Kill()
|
||||||
|
} else {
|
||||||
|
sigErr = proc.Signal(syscall.SIGTERM)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
if sigErr != nil {
|
if sigErr != nil {
|
||||||
return pid, sigErr
|
return pid, sigErr
|
||||||
|
|
@ -752,7 +765,8 @@ func (h *Handler) handleGatewayStop(w http.ResponseWriter, r *http.Request) {
|
||||||
gateway.mu.Lock()
|
gateway.mu.Lock()
|
||||||
defer gateway.mu.Unlock()
|
defer gateway.mu.Unlock()
|
||||||
|
|
||||||
if gateway.cmd == nil || gateway.cmd.Process == nil {
|
// Check if gateway is running (either started by us or attached externally)
|
||||||
|
if gateway.cmd == nil && gateway.pidData == nil {
|
||||||
w.Header().Set("Content-Type", "application/json")
|
w.Header().Set("Content-Type", "application/json")
|
||||||
json.NewEncoder(w).Encode(map[string]any{
|
json.NewEncoder(w).Encode(map[string]any{
|
||||||
"status": "not_running",
|
"status": "not_running",
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue