When you are running a golang program, you might want a server to gracefully shutdown when it receives a SIGTERM
, or a command-line tool to stop processing input if it receives a SIGINT
. Here’s how to handle signals in Go with channels.
Go signal notification works by sending os.Signal
values on a channel. We’ll create a channel to receive these notifications (we’ll also make one to notify us when the program can exit).
signal.Notify
registers the given channel to receive notifications of the specified signals.
The goroutine executes a blocking receive for signals. When it gets one it’ll print it out and then notify the program that it can finish.
The program will wait here until it gets the expected signal (as indicated by the goroutine above sending a value on done
) and then exit.
package main import "fmt" import "os" import "os/signal" import "syscall" func main() { sigs := make(chan os.Signal, 1) done := make(chan bool, 1) signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) go func() { sig := <-sigs fmt.Println() fmt.Println(sig) done <- true }() fmt.Println("awaiting signal") <-done fmt.Println("exiting") }
View on github