Goでシグナルを受け取ってゴニョゴニョしたくなったとします。SIGINT
かSIGTERM
を受け取ったら終了してSIGUSR1
を受け取ったらそのことを通知するようなGoのプログラムは以下の様な感じで書けました。
package main
import (
"log"
"os"
"os/signal"
"syscall"
)
func main() {
c := make(chan os.Signal, 1)
ec := make(chan int)
signal.Notify(c, syscall.SIGTERM, syscall.SIGINT, syscall.SIGUSR1)
go func() {
for {
switch <-c {
case syscall.SIGTERM:
ec <- 0
case syscall.SIGINT:
ec <- 0
case syscall.SIGUSR1:
log.Println("SIGUSR1!")
}
}
}()
<-ec
}
シグナルが来る時にメモリを確保しないようにチャネルc
のサイズを指定しています。printしているところに何か処理を書けばSIGUSR1
シグナルを受け取ったらいい感じにするプログラムが書けると思います。
別途PIDファイルを作りたい場合は以下の記事を参考にしてください。