Skip to content

Commit 68e8abf

Browse files
Merge pull request #110 from basecamp/exit-code
Return correct exit code when process signalled
2 parents 5527688 + 6898eea commit 68e8abf

File tree

2 files changed

+19
-7
lines changed

2 files changed

+19
-7
lines changed

internal/upstream_process.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,7 @@ func (p *UpstreamProcess) Run() (int, error) {
3636
go p.handleSignals()
3737
err = p.cmd.Wait()
3838

39-
var exitErr *exec.ExitError
40-
if errors.As(err, &exitErr) {
41-
return exitErr.ExitCode(), nil
42-
}
43-
44-
return 0, err
39+
return p.handleExitCode(err)
4540
}
4641

4742
func (p *UpstreamProcess) Signal(sig os.Signal) error {
@@ -56,3 +51,17 @@ func (p *UpstreamProcess) handleSignals() {
5651
slog.Info("Relaying signal to upstream process", "signal", sig.String())
5752
_ = p.Signal(sig)
5853
}
54+
55+
func (p *UpstreamProcess) handleExitCode(err error) (int, error) {
56+
var exitErr *exec.ExitError
57+
if errors.As(err, &exitErr) {
58+
if status, ok := exitErr.Sys().(syscall.WaitStatus); ok {
59+
if status.Signaled() {
60+
return 128 + int(status.Signal()), nil
61+
}
62+
}
63+
return exitErr.ExitCode(), nil
64+
}
65+
66+
return 0, err
67+
}

internal/upstream_process_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,20 @@ func TestUpstreamProcess(t *testing.T) {
1919
t.Run("signal a process to stop it", func(t *testing.T) {
2020
var exitCode int
2121
var err error
22+
done := make(chan struct{})
2223

2324
p := NewUpstreamProcess("sleep", "10")
2425

2526
go func() {
2627
exitCode, err = p.Run()
28+
close(done)
2729
}()
2830

2931
<-p.Started
3032
assert.NoError(t, p.Signal(syscall.SIGTERM))
33+
<-done
3134

3235
assert.NoError(t, err)
33-
assert.Equal(t, 0, exitCode)
36+
assert.Equal(t, 128+int(syscall.SIGTERM), exitCode)
3437
})
3538
}

0 commit comments

Comments
 (0)