graceful-shutdown
Permite que seu agente implemente desligamentos seguros de servidores, garantindo a conclusão de tarefas.
O que ela faz
Essa ferramenta ajuda programas de computador a terminarem suas tarefas de forma organizada. Ela garante que tudo que estava sendo feito seja concluído antes de desligar, evitando perdas de dados ou interrupções bruscas.
Quando usar
- ✓Ao atualizar um programa sem que ele precise parar de funcionar de repente.
- ✓Quando um programa que processa tarefas precisa terminar de forma segura.
- ✓Ao usar sistemas que enviam um sinal para desligar o programa educadamente.
Exemplo do que pedir para a IA
“Como faço para que meu programa termine de forma segura quando recebe um sinal de desligamento?”
Quer saber mais? Abra as seções abaixo.
Como usar
O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.
Link da skill
Mensagem pronta para colar
Como funciona
O programa escuta por sinais de desligamento (como Ctrl+C). Ao receber um, ele para de aceitar novas tarefas, espera as tarefas atuais terminarem e libera os recursos antes de sair.
Instalação
Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.
No terminal (Claude Code, Codex, Cursor), na pasta do projeto:
npx skills add sickn33/agentic-awesome-skills --skill graceful-shutdownOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/sickn33/agentic-awesome-skills/main/plugins/agentic-awesome-skills-claude/skills/graceful-shutdown/SKILL.md -o SKILL.mdConteúdo técnico (SKILL.md)
Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.
Desligamento Gracioso
Visão Geral
Uma habilidade para implementar o desligamento gracioso em servidores, workers e processos de longa duração. Garante que requisições em andamento sejam concluídas, trabalhos em segundo plano terminem ou sejam salvos, conexões de banco de dados sejam fechadas corretamente e o processo saia com um código de status apropriado. Essencial para implantações sem interrupção em orquestradores de contêineres (Kubernetes, ECS, Docker Compose) e gerenciadores de processos bare-metal (systemd, PM2).
Quando Usar Esta Habilidade
- Use ao construir um servidor HTTP que não deve descartar conexões ativas durante implantações.
- Use ao escrever um worker em segundo plano que processa trabalhos de uma fila.
- Use ao implantar no Kubernetes, Docker ou qualquer ambiente que envie SIGTERM antes de encerrar.
- Use quando o usuário disser "desligamento gracioso", "drenar conexões", "lidar com SIGTERM", "sem interrupção" ou "não matar requisições ativas".
- Use ao implementar endpoints de verificação de saúde (
/healthz,/readyz) para orquestradores.
Como Funciona
Passo 1: Registrar manipuladores de sinal cedo
Capture SIGTERM (desligamento do orquestrador) e SIGINT (Ctrl+C) no início do processo. Defina uma flag para que a aplicação saiba que está desligando.
let isShuttingDown = false;
function onShutdownSignal(signal: string): void {
if (isShuttingDown) return; // prevent double-shutdown
isShuttingDown = true;
console.log(`Received ${signal}, starting graceful shutdown...`);
shutdown();
}
process.on("SIGTERM", () => onShutdownSignal("SIGTERM"));
process.on("SIGINT", () => onShutdownSignal("SIGINT"));
Passo 2: Parar de aceitar novo trabalho
Imediatamente pare o servidor de aceitar novas conexões. Para servidores HTTP, chame server.close(). Para workers de fila, pare de consultar novos trabalhos.
async function shutdown(): Promise<void> {
// 1. Stop accepting new connections
server.close(() => {
console.log("Server closed — no new connections accepted");
});
// 2. Mark health check as not-ready so load balancers stop routing
// (readiness probe returns 503 from this point)
}
Passo 3: Drenar trabalho em andamento com um prazo
Espere que requisições ativas e tarefas em segundo plano terminem, mas imponha um prazo rígido para que o processo nunca fique pendurado indefinidamente.
const DRAIN_TIMEOUT_MS = 25_000; // must be less than orchestrator's terminationGracePeriodSeconds
async function drainAndExit(): Promise<void> {
const deadline = setTimeout(() => {
console.error("Drain timeout reached — forcing exit");
process.exit(1);
}, DRAIN_TIMEOUT_MS);
deadline.unref(); // don't keep the event loop alive just for the timer
try {
// Wait for active connections to finish
await waitForActiveConnections();
// Flush buffered data (logs, metrics, queues)
await flushBuffers();
// Close external resource handles
await closeResources();
console.log("Graceful shutdown complete");
process.exit(0);
} catch (err) {
console.error("Error during shutdown:", err);
process.exit(1);
}
}
Passo 4: Implementar sondas de prontidão e vivacidade
Orquestradores usam estas para decidir se devem rotear tráfego e se devem reiniciar o contêiner. A vivacidade prova que o processo está ativo; a prontidão controla se o tráfego é roteado. Enquanto o listener ainda estiver disponível durante uma drenagem, mantenha a vivacidade saudável e retorne 503 apenas da prontidão. Após o fechamento do listener, novas sondas não conseguem se conectar, portanto, não prometa que a vivacidade HTTP permanecerá alcançável durante toda a janela de terminação.
import { createServer, IncomingMessage, ServerResponse } from "node:http";
function handleHealthCheck(req: IncomingMessage, res: ServerResponse): void {
if (req.url === "/healthz") {
// Keep liveness distinct from readiness while the listener is available.
// Drain-rejection middleware must not turn this endpoint into a 503.
res.writeHead(200).end("ok");
return;
}
if (req.url === "/readyz") {
// Readiness: 503 during shutdown so the load balancer stops routing.
if (isShuttingDown) {
res.writeHead(503).end("shutting down");
} else {
res.writeHead(200).end("ready");
}
return;
}
}
Passo 5: Rastrear conexões ativas
Mantenha uma contagem de requisições em andamento para saber quando a drenagem estiver completa. Use um guarda "once" cobrindo os eventos finish e close para que desconexões de clientes (requisições abortadas) decrementem corretamente o contador.
let activeConnections = 0;
let drainResolve: (() => void) | null = null;
…
Perguntas frequentes
Por que é importante 'desligar graciosamente'?
Para evitar perder dados, corromper arquivos ou interromper usuários que estão no meio de uma operação. Garante uma transição suave, especialmente em sistemas automatizados.
O que acontece se eu não usar essa ferramenta?
O programa pode ser encerrado abruptamente, cortando conexões e deixando tarefas inacabadas. Isso pode causar erros, perda de dados e problemas em sistemas que dependem dele.
Essa ferramenta funciona para qualquer tipo de programa?
Sim, ela é projetada para servidores, processos que rodam em segundo plano (workers) e qualquer programa que precise de um encerramento controlado e seguro.
Detalhes
Descrição original do autor
Implement graceful shutdown for servers and workers: drain connections, finish in-flight work, release resources, and exit cleanly on SIGTERM/SIGINT.
Popularidade
- Estrelas no GitHub
- 48 mil
- Posição no ranking
- #3166
- Licença
- MIT
- Atualizada em
- 15/10/2026
Comentários
- …
Mais skills deste repositório
00-andruia-consultant
Ajuda seu agente a iniciar ou melhorar projetos de IA. Ele analisa código, sugere ferramentas e cria planos de ação em espanhol.
sickn33/agentic-awesome-skills
007
Faz seu agente realizar auditorias de segurança e modelagem de ameaças. É útil para proteger projetos contra ataques e vulnerabilidades.
sickn33/agentic-awesome-skills
10-andruia-skill-smith
Ajuda seu agente a criar ou melhorar ferramentas de IA. Ele define como as ferramentas funcionam, escreve a documentação e valida a estrutura.
sickn33/agentic-awesome-skills
20-andruia-niche-intelligence
Faz seu agente criar um resumo sobre um setor específico. É útil para entender o contexto, regras, padrões de uso e riscos de um projeto, usando fontes confiáveis.
sickn33/agentic-awesome-skills
Skills parecidas
bun-runtime
Faz seu agente usar o Bun para rodar, organizar e testar código. Ajuda a escolher o Bun em vez de outras ferramentas e a migrar projetos existentes.
affaan-m/ECC
database-migrations
Ajuda seu agente a fazer mudanças seguras em bancos de dados. Ele garante que as alterações possam ser desfeitas e minimiza o tempo de inatividade.
affaan-m/ECC
deployment-patterns
Configura fluxos de implantação e CI/CD, containerização e estratégias de rollback para garantir lançamentos seguros.
affaan-m/ECC