« Back to Index

Go: signal handling SIGINT/SIGTERM of a subprocess

View original Gist on GitHub

Tags: #go

binary.sh

#!/usr/bin/env bash

while :
do
  date "+%H:%M:%S"
  sleep 1
done

main.go

func main() {
	sig := make(chan os.Signal, 1)

	signals := []os.Signal{
		syscall.SIGINT,
		syscall.SIGTERM,
	}

	signal.Notify(sig, signals...)

	cmd := exec.Command("./binary.sh")
	cmd.Stdout = out

	go func(sig chan os.Signal, cmd *exec.Cmd) {
		<-sig
		signal.Stop(sig)

		err := cmd.Process.Signal(os.Kill)
		if err != nil {
			log.Fatal(err)
		}
	}(sig, cmd)

	err := cmd.Start()
	if err != nil {
		return err
	}

	cmd.Wait()
}