Handle os signal in golang

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

PreNext