feat(process): signal process groups

This commit is contained in:
Virgil 2026-04-03 23:53:19 +00:00
parent 252f68db64
commit e58f376e4c
2 changed files with 30 additions and 0 deletions

View file

@ -188,6 +188,14 @@ func (p *Process) Signal(sig os.Signal) error {
return nil
}
if p.killGroup {
sysSig, ok := sig.(syscall.Signal)
if !ok {
return p.cmd.Process.Signal(sig)
}
return syscall.Kill(-p.cmd.Process.Pid, sysSig)
}
return p.cmd.Process.Signal(sig)
}

View file

@ -225,6 +225,28 @@ func TestProcess_Signal(t *testing.T) {
err = proc.Signal(os.Interrupt)
assert.ErrorIs(t, err, ErrProcessNotRunning)
})
t.Run("signals process group when kill group is enabled", func(t *testing.T) {
svc, _ := newTestService(t)
proc, err := svc.StartWithOptions(context.Background(), RunOptions{
Command: "sh",
Args: []string{"-c", "trap '' INT; sh -c 'trap - INT; sleep 60' & wait"},
Detach: true,
KillGroup: true,
})
require.NoError(t, err)
err = proc.Signal(os.Interrupt)
assert.NoError(t, err)
select {
case <-proc.Done():
// Good - the whole process group responded to the signal.
case <-time.After(5 * time.Second):
t.Fatal("process group should have been terminated by signal")
}
})
}
func TestProcess_CloseStdin(t *testing.T) {