diff --git a/main.go b/main.go index 0adf40b..4b98c97 100644 --- a/main.go +++ b/main.go @@ -61,6 +61,8 @@ func main() { os.Exit(0) } + go NewSignaler().forwardAllSignalsToProcessGroup() + processor := &processor{ scanner: bufio.NewScanner(os.Stdin), output: os.Stdout, diff --git a/signaler.go b/signaler.go new file mode 100644 index 0000000..9bd0a4e --- /dev/null +++ b/signaler.go @@ -0,0 +1,38 @@ +package main + +import ( + "os" + "os/signal" + "syscall" +) + +type signaler struct { + processGroupID int +} + +func NewSignaler() *signaler { + signaler := &signaler{} + + pgid, err := syscall.Getpgid(os.Getpid()) + if err != nil { + signaler.processGroupID = pgid + } else { + debug.Println("[Warning] unable to determine process group, signaling will be broken") + } + + return signaler +} + +func (s *signaler) forwardAllSignalsToProcessGroup() { + signalChan := make(chan os.Signal, 1) + signal.Notify(signalChan) + + for { + signal := <-signalChan + + syscallSignal, isSyscallSignalType := signal.(syscall.Signal) + if s.processGroupID != 0 && isSyscallSignalType { + syscall.Kill(s.processGroupID, syscallSignal) + } + } +}