- Go でシグナルを扱うには
singal.Notify
を使う
- 以下のサンプルコードでは
SIGINT = ^C
を受信するとアプリケーションが停止する
sigC := make(chan os.Signal, 1)
のように必ずバッファありチャネルが必要
- os.Interrupt と os.Kill の2つはすべての OS で使えることが保証されている
package main
import (
"log"
"os"
"os/signal"
"sync"
"time"
)
func main() {
sigs := []os.Signal{os.Interrupt}
sigC := make(chan os.Signal, 1)
signal.Notify(sigC, sigs...)
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
for {
select {
case <-time.After(2 * time.Second):
log.Println("waiting...")
case sig := <-sigC:
log.Println("got signal", sig)
return
}
}
}()
wg.Wait()
}
参考サイト