У меня есть http-сервер (запущен с помощью http.Handle
), и я хотел бы сделать некоторые операции.
Как я могу это сделать (на linux)? Можно ли выполнять эти операции в случае ctrl-C?
Я не знаком с сигналами unix, поэтому ответ может быть тривиальным.
Ответ 1
Вы можете подписаться на сигналы TERM и INT с помощью пакета signal. Но учтите, что эти сигналы отправляются только тогда, когда процесс убит явно; нормальный выход (инициированный самим процессом) не включает никаких сигналов. Я думаю, что для обычного выхода просто делайте что-то в основной рутине (которая, предположительно, должна появляться рабочих goroutines, а затем ждать на них).
Прочитайте man 7 signal
для получения более общей информации о сигналах POSIX.
Ответ 2
Используя ответ kostix, я построил этот код (теперь адаптированный для Go1), чтобы поймать сигнал прерывания и выполнить некоторые операции перед выходом:
go func() {
sigchan := make(chan os.Signal, 10)
signal.Notify(sigchan, os.Interrupt)
<-sigchan
log.Println("Program killed !")
// do last actions and wait for all write operations to end
os.Exit(0)
}()
// start main program tasks