Понякога ни се иска нащите програми да обработват умно Юникс
сигнали. Например бихме
искали сървърът ни да спира, когато получи сигнал SIGTERM, или наше
приложение за командния ред да спре да обработва входни данни, щом получи
сигнал SIGINT. Ето как да обработваме сигнали в Го с помощта на вида
Context.
import (
"context"
"fmt"
"os/signal"
"syscall"
)
signal.NotifyContext връща обект – текущ смисъл, който бива прекъснат, щом
някой от сигналите в списъка пристигне.
func main() {
ctx, stop := signal.NotifyContext(
context.Background(), syscall.SIGINT, syscall.SIGTERM)
defer stop()
Програмата ще чака тук, докато някой от настроените сигнали бъде получен.
fmt.Println("чакам знак")
<-ctx.Done()
context.Cause дава отчет защо смисълът е бил прекъснат. При
прекъсване, причинено от сигнал, тази стойност включва стойността на
сигнала.
fmt.Println()
fmt.Println(context.Cause(ctx))
fmt.Println("излизам")
}
Когато пуснем тази програма, тя спира и чака знак. Като натиснем ctrl-C (в
терминала се вижда като ^C) изпращаме сигнал SIGINT, който кара
програмата да изведе “излизам” и да излезе. “interrupt” е включената стойност
на сигнала в причината за прекъсването context.Cause.
$ go run signals.go
чакам знак
^C
interrupt signal received
излизам
Следващ пример: Изход.