tl;dt
目的
ちょっとした調査、アプリケーションにどんなシグナルが送られてくるか知りたかった
方法
Go言語は以下のようにすると作成したgoroutineにシグナルがあるとハンドリングできます。
c := make(chan os.Signal)
signal.Notify(c)
go func() {
for {
s := <-c
log.Println("signal :", s)
}
}
}()
よしなにロギング
標準出力とログファイルに書き出したかったのでio.MultiWriter
を利用
logfile, err := os.OpenFile("./signal.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
panic("cannnot create log :" + err.Error())
}
defer logfile.Close()
log.SetOutput(io.MultiWriter(logfile, os.Stdout))
log.SetFlags(log.Ldate | log.Ltime)
こんな感じでシグナルをハンドリングして流してくれる
% tail -f signal.log
2020/02/09 21:48:01 alive :
2020/02/09 21:49:01 alive :
2020/02/09 21:50:01 alive :
2020/02/09 21:50:33 signal : hangup false
SIGTERMが送られてきたら落とすようにしました。60秒に一回生存確認をしています。
また、SIGKILLとかのハンドリングできない系はハンドリングできずに死にます。
知見
SIGWINCHというターミナルのWindowサイズの変更のシグナルがあることを知った。