Skip to content

Instantly share code, notes, and snippets.

@vyskocilm
Created March 2, 2022 08:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vyskocilm/c0d116c8c4fd99b482590ee99428e322 to your computer and use it in GitHub Desktop.
Save vyskocilm/c0d116c8c4fd99b482590ee99428e322 to your computer and use it in GitHub Desktop.
Catching signals via signal.NotifyContext
package main
import (
"context"
"log"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
log.Print("setting NotifyContext up")
go func() {
signal := syscall.SIGKILL
log.Printf("goroutine: preparing to send signal %s(%d) to myself", signal, signal)
time.Sleep(2 * time.Second)
p, err := os.FindProcess(os.Getpid())
if err != nil {
log.Fatal(err)
}
log.Printf("goroutine: kill %d %d", signal, os.Getpid())
err = p.Signal(signal)
if err != nil {
log.Fatal(err)
}
}()
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM, syscall.SIGKILL)
defer cancel()
log.Print("<-ctx.Done()")
<-ctx.Done()
log.Print("context.Done")
}
@vyskocilm
Copy link
Author

go build && main

2022/03/02 09:33:10 setting NotifyContext up
2022/03/02 09:33:10 goroutine: preparing to send signal killed(9) to myself
2022/03/02 09:33:10 <-ctx.Done()
2022/03/02 09:33:12 goroutine: kill 9 2916
Killed

When any other signal is used on line 16 (syscall.SIGTERM), then context.Done is printed.

go build && ./main 
2022/03/02 09:37:05 setting NotifyContext up
2022/03/02 09:37:05 goroutine: preparing to send signal terminated(15) to myself
2022/03/02 09:37:05 <-ctx.Done()
2022/03/02 09:37:07 goroutine: kill 15 3773
2022/03/02 09:37:07 context.Done

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment