From c60f355b2544c57a75ae9a9f67ade1bffdddad7a Mon Sep 17 00:00:00 2001 From: Virgil Date: Tue, 31 Mar 2026 19:33:51 +0000 Subject: [PATCH] fix(process): emit kill action immediately Co-Authored-By: Virgil --- process.go | 12 ++++++++++++ service.go | 19 +++++++++++++++---- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/process.go b/process.go index ced44e3..01bf7aa 100644 --- a/process.go +++ b/process.go @@ -38,6 +38,7 @@ type ManagedProcess struct { gracePeriod time.Duration killGroup bool lastSignal string + killEmitted bool } // Process is kept as a compatibility alias for ManagedProcess. @@ -219,3 +220,14 @@ func (p *ManagedProcess) requestedSignal() string { defer p.mu.RUnlock() return p.lastSignal } + +func (p *ManagedProcess) markKillEmitted() bool { + p.mu.Lock() + defer p.mu.Unlock() + + if p.killEmitted { + return false + } + p.killEmitted = true + return true +} diff --git a/service.go b/service.go index 79a7a52..51ae453 100644 --- a/service.go +++ b/service.go @@ -230,10 +230,7 @@ func (s *Service) StartWithOptions(ctx context.Context, opts RunOptions) core.Re close(proc.done) if status == StatusKilled { - _ = s.Core().ACTION(ActionProcessKilled{ - ID: id, - Signal: killedSignal, - }) + s.emitKilledAction(proc, killedSignal) } s.Core().ACTION(ActionProcessExited{ ID: id, @@ -308,6 +305,7 @@ func (s *Service) Kill(id string) error { if err := proc.Kill(); err != nil { return err } + s.emitKilledAction(proc, proc.requestedSignal()) return nil } @@ -490,3 +488,16 @@ func normalizeSignalName(sig syscall.Signal) string { return sig.String() } } + +func (s *Service) emitKilledAction(proc *ManagedProcess, signal string) { + if proc == nil || !proc.markKillEmitted() { + return + } + if signal == "" { + signal = "SIGKILL" + } + _ = s.Core().ACTION(ActionProcessKilled{ + ID: proc.ID, + Signal: signal, + }) +}