Skip to content

Commit 73fdc83

Browse files
committed
Also catch SIGTERM on default settings.
This is useful with services like AWS Fargate where SIGTERM is sent when container is being stopped [1]. Can drastically speed up the shutdown and most importantly does it gracefully. Caveats: won't work on Windows. [1] https://aws.amazon.com/blogs/containers/graceful-shutdowns-with-ecs/ Signed-off-by: Ville Valkonen <[email protected]>
1 parent e03f211 commit 73fdc83

File tree

2 files changed

+25
-9
lines changed

2 files changed

+25
-9
lines changed

sigmod/signal.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package sigmod
44
import (
55
"os"
66
"os/signal"
7+
"syscall"
78
)
89

910
const ID = "sigmod"
@@ -14,10 +15,13 @@ type Listener struct {
1415
}
1516

1617
// New creates signal listener for given signals.
17-
// If no signal is provided, os.Interrupt will be used.
18+
// If no signal is provided, os.Interrupt and SIGTERM will be used.
1819
func New(signals ...os.Signal) *Listener {
1920
if len(signals) == 0 {
20-
signals = []os.Signal{os.Interrupt}
21+
signals = []os.Signal{
22+
os.Interrupt,
23+
syscall.SIGTERM, // XXX Not available on Windows
24+
}
2125
}
2226
return &Listener{
2327
sigs: signals,

sigmod/signal_test.go

+19-7
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package sigmod_test
22

33
import (
44
"os"
5+
"runtime"
56
"syscall"
67
"testing"
78

@@ -12,23 +13,34 @@ import (
1213

1314
func TestListener(t *testing.T) {
1415
tests := []struct {
15-
name string
16-
signals []os.Signal
16+
name string
17+
signals []os.Signal
18+
inputSig syscall.Signal
1719
}{
1820
{
19-
name: "Defaults",
20-
signals: []os.Signal{},
21+
name: "Defaults",
22+
signals: []os.Signal{},
23+
inputSig: syscall.SIGINT,
2124
},
2225
{
23-
name: "Interrupt",
24-
signals: []os.Signal{os.Interrupt},
26+
name: "Interrupt",
27+
signals: []os.Signal{os.Interrupt},
28+
inputSig: syscall.SIGINT,
29+
},
30+
{
31+
name: "SIGTERM",
32+
signals: []os.Signal{syscall.SIGTERM},
33+
inputSig: syscall.SIGTERM,
2534
},
2635
}
2736
for _, tt := range tests {
2837
t.Run(tt.name, func(t *testing.T) {
2938
l := sigmod.New(tt.signals...)
3039
require.NoError(t, l.Init())
31-
require.NoError(t, syscall.Kill(syscall.Getpid(), syscall.SIGINT))
40+
if tt.inputSig == syscall.SIGTERM && runtime.GOOS == "windows" {
41+
t.Skip("Windows doesn't support SIGTERM")
42+
}
43+
require.NoError(t, syscall.Kill(syscall.Getpid(), tt.inputSig))
3244
require.NoError(t, l.Run())
3345
require.NoError(t, l.Stop())
3446
require.Equal(t, "sigmod", l.ID())

0 commit comments

Comments
 (0)