Функция signal.Notify

Функция signal.Notify позволяет программе получать уведомления о поступлении системных сигналов. В первый параметр она принимает канал, в который будут отправляться полученные сигналы, а во второй параметр принимает один или несколько сигналов, которые необходимо перехватывать. Если второй параметр не указан, функция перехватывает все сигналы, которые не приводят к завершению программы.

Синтаксис

gosignal.Notify(c, sigs...)

Пример sect

Давайте создадим программу, которая перехватывает сигнал SIGINT (генерируется при нажатии Ctrl+C):

gopackage main

import (
  "fmt"
  "os"
  "os/signal"
  "syscall"
)

func main() {
  sigCh := make(chan os.Signal, 1)
  signal.Notify(sigCh, syscall.SIGINT)

  fmt.Println("Waiting for SIGINT (Ctrl+C)...")
  sig := <-sigCh
  fmt.Printf("Received signal: %s\n", sig)
}

Результат выполнения кода (при нажатии Ctrl+C):

go"Waiting for SIGINT (Ctrl+C)..."
"Received signal: interrupt"

Пример sect

Давайте перехватим несколько сигналов одновременно:

gopackage main

import (
  "fmt"
  "os"
  "os/signal"
  "syscall"
)

func main() {
  sigCh := make(chan os.Signal, 1)
  signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)

  fmt.Println("Waiting for SIGINT or SIGTERM...")
  sig := <-sigCh
  fmt.Printf("Received signal: %s\n", sig)
}

Результат выполнения кода (при отправке SIGTERM):

go"Waiting for SIGINT or SIGTERM..."
"Received signal: terminated"

Пример sect

Давайте создадим программу, которая корректно завершает работу при получении сигнала:

gopackage main

import (
  "fmt"
  "os"
  "os/signal"
  "syscall"
)

func main() {
  sigCh := make(chan os.Signal, 1)
  signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)

  fmt.Println("Program is running. Press Ctrl+C to stop.")

  go func() {
    <-sigCh
    fmt.Println("\nShutting down gracefully...")
    os.Exit(0)
  }()

  // Бесконечный цикл для имитации работы
  select {}
}

Результат выполнения кода (при нажатии Ctrl+C):

go"Program is running. Press Ctrl+C to stop."
"\nShutting down gracefully..."

Смотрите также

  • функцию signal.Stop,
    которая останавливает перехват сигналов для канала
  • функцию signal.Ignore,
    которая игнорирует указанные сигналы
  • функцию signal.Reset,
    которая сбрасывает обработку сигналов к стандартному поведению
  • функцию signal.NotifyContext,
    которая создает контекст, отменяемый при получении сигнала