Делать действия в конце выполнения

У меня есть 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