Что такое сигнал `SIGHUP` и как его обрабатывают в Go-приложениях?

Ответ

SIGHUP (Signal Hang Up) — это сигнал, который исторически отправлялся процессу, когда его управляющий терминал отключался.

  • Поведение по умолчанию: Завершение процесса.
  • Современное использование: В серверных приложениях и демонах SIGHUP принято перехватывать и использовать как триггер для перезагрузки конфигурации без остановки сервиса (zero-downtime reload). Это позволяет применять новые настройки (например, изменить уровень логирования или таймауты) "на лету".

Отправить сигнал процессу можно командой kill:

kill -HUP <process_id>

Пример обработки SIGHUP в Go:

package main

import (
    "log"
    "os"
    "os/signal"
    "syscall"
    "time"
)

// loadConfig - функция, имитирующая загрузку конфигурации
func loadConfig() {
    log.Println("Configuration reloaded!")
    // Здесь могла бы быть логика чтения файла .yaml, .json и т.д.
}

func main() {
    // Создаем канал для получения сигналов ОС
    sigChan := make(chan os.Signal, 1)
    // Уведомляем канал о получении сигнала SIGHUP
    signal.Notify(sigChan, syscall.SIGHUP)

    // Запускаем горутину для обработки сигналов
    go func() {
        for {
            // Блокируемся до получения сигнала
            <-sigChan
            log.Println("Received SIGHUP. Reloading configuration...")
            loadConfig()
        }
    }()

    log.Println("Server started. PID:", os.Getpid())
    log.Println("Waiting for SIGHUP signal (e.g., 'kill -HUP', os.Getpid())...")

    // Бесконечный цикл, чтобы приложение не завершалось
    for {
        time.Sleep(10 * time.Second)
    }
}