feat(process): allow zero-value task signals

Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
Virgil 2026-04-04 04:19:17 +00:00
parent 8d1a0d0655
commit 3930aed49a
3 changed files with 25 additions and 4 deletions

View file

@ -66,6 +66,7 @@ type TaskProcessKill struct {
}
// TaskProcessSignal requests signalling a managed process by ID or PID through Core.PERFORM.
// Signal 0 is allowed for liveness checks.
//
// Example:
//

View file

@ -668,10 +668,6 @@ func (s *Service) handleTask(c *core.Core, task core.Task) core.Result {
return core.Result{Value: coreerr.E("Service.handleTask", "task process kill requires an id or pid", nil), OK: false}
}
case TaskProcessSignal:
if m.Signal == 0 {
return core.Result{Value: coreerr.E("Service.handleTask", "task process signal requires a signal", nil), OK: false}
}
switch {
case m.ID != "":
if err := s.Signal(m.ID, m.Signal); err != nil {

View file

@ -815,6 +815,30 @@ func TestService_OnStartup(t *testing.T) {
assert.Equal(t, StatusKilled, proc.Status)
})
t.Run("allows signal zero liveness checks", func(t *testing.T) {
svc, c := newTestService(t)
err := svc.OnStartup(context.Background())
require.NoError(t, err)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
proc, err := svc.Start(ctx, "sleep", "60")
require.NoError(t, err)
result := c.PERFORM(TaskProcessSignal{
ID: proc.ID,
Signal: syscall.Signal(0),
})
require.True(t, result.OK)
assert.True(t, proc.IsRunning())
cancel()
<-proc.Done()
})
t.Run("registers process.wait task", func(t *testing.T) {
svc, c := newTestService(t)