Создать контекст с отменой. При получении SIGTERM/SIGINT вызвать cancel(). Сервер и воркеры принимают этот контекст и в select проверяют ctx.Done(); при отмене останавливают приём новых задач и завершают работу. Дожидаться выхода через WaitGroup или errgroup.
ctx, cancel := context.WithCancel(context.Background())
sigCh := make(chan os.Signal, 1)
signal.Notify(sigCh, syscall.SIGTERM)
go func() { <-sigCh; cancel() }()
srv.Run(ctx)