golang でシグナルを扱う

golang でシグナルを扱う

  • 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() {
    // 受信するシグナル
    // Interrupt Signal = syscall.SIGINT
    sigs := []os.Signal{os.Interrupt}

    // 必ずバッファありチャネルが必要
    // https://budougumi0617.github.io/2020/09/06/why_signal_notify_want_buffered_channel/
    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()
}

参考サイト