feat(process): signal process groups
This commit is contained in:
parent
252f68db64
commit
e58f376e4c
2 changed files with 30 additions and 0 deletions
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue