Help us shape the future of Go! Take the 2026 Go Developer Survey

shutdown

package
v1.16.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 30, 2026 License: Apache-2.0 Imports: 8 Imported by: 0

Documentation

Overview

Package shutdown — graceful-shutdown helper для cmd/<svc>/main.go.

Контракт: один Manager на процесс. Регистрируем cleanup-handlers; при SIGTERM/SIGINT (или ctx.Cancel) хэндлеры выполняются в LIFO-порядке (close-в-обратном-порядке-открытия). Каждый handler ограничен timeout'ом (WithHandlerTimeout, дефолт 10s): зависший cleanup не задерживает завершение процесса бесконечно — он бросается, фиксируется ErrHandlerTimeout, остальные продолжают выполняться.

Минимальная самодостаточная реализация (без внешних зависимостей).

Index

Constants

This section is empty.

Variables

View Source
var ErrHandlerTimeout = errors.New("shutdown: handler timed out")

ErrHandlerTimeout фиксируется, когда cleanup-handler не уложился в handler-timeout. Возвращается из Wait/Close как первая ошибка, если других нет.

Functions

This section is empty.

Types

type Handler

type Handler func() error

Handler — функция-cleanup. Должна быть идемпотентной и завершаться в пределах handler-timeout'а; иначе она бросается (ErrHandlerTimeout), shutdown продолжается.

type Manager

type Manager struct {
	// contains filtered or unexported fields
}

Manager собирает cleanup-handlers и выполняет их в LIFO при сигнале или Close().

func New

func New(opts ...Option) *Manager

New создает Manager и стартует goroutine-listener для SIGINT/SIGTERM.

Listener неблокирующий: первый сигнал инициирует shutdown (вызов Close()); последующие сигналы игнорируются (если процесс «завис», admin делает kill -9).

func (*Manager) Close

func (m *Manager) Close() error

Close — программный shutdown без сигнала. Идемпотентен (повторный вызов no-op).

func (*Manager) OnExit

func (m *Manager) OnExit(handlers ...Handler)

OnExit регистрирует один или несколько handlers. Они выполнятся в обратном порядке регистрации (LIFO) при shutdown.

Если shutdown уже инициирован, поздно зарегистрированный handler выполняется немедленно (best-effort, под тем же handler-timeout'ом) — чтобы ресурс, открытый уже на фазе завершения, не остался без cleanup'а (без silent loss). Можно вызывать многократно из любой goroutine.

func (*Manager) Wait

func (m *Manager) Wait(ctx context.Context) error

Wait блокируется до получения сигнала + завершения всех handlers, либо до отмены ctx. Возвращает первую ошибку handler-а или ctx.Err().

type Option

type Option func(*Manager)

Option настраивает Manager.

func WithHandlerTimeout

func WithHandlerTimeout(d time.Duration) Option

WithHandlerTimeout задает верхнюю границу выполнения одного handler'а. d<=0 отключает ограничение (handler выполняется синхронно без timeout'а).

func WithLogger

func WithLogger(l *slog.Logger) Option

WithLogger задает logger для наблюдаемости shutdown'а. Используется для логирования ошибок best-effort cleanup'а на пути поздней регистрации (OnExit после начала shutdown'а), где ошибка не может быть возвращена вызвавшему и иначе была бы потеряна молча. nil → slog.Default().

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL