shutdown

package
v1.4.0 Latest Latest
Warning

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

Go to latest
Published: Sep 10, 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