graceful-shutdown について
プロセスを適切に終了するためのソフトウェア開発スキルです。デプロイ、再起動、長時間実行ジョブの際に、処理中のリクエストを完了し、接続を閉じてリソースを解放します。
主な機能
- 01SIGTERM と SIGINT の処理
- 02処理中リクエストの完了待ち
- 03シャットダウンタイムアウト
- 04データベース接続のクリーンアップ
- 05サーバーとワーカーの終了対応
活用シーン
- 01ローリング更新時のサービス終了
- 02サーバー再起動前のリクエスト排出
- 03データベース接続プールの解放
- 04バックグラウンドワーカーの安全な停止
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ aj-geddes/ useful-ai-prompts --skill graceful-shutdownインストール後、Claude Code で/graceful-shutdownを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/database-connection-pool-shutdown.mdexpressjs-graceful-shutdown.mdkubernetes-aware-shutdown.mdpm2-graceful-shutdown.mdpythonflask-graceful-shutdown.mdworker-process-shutdown.mdscripts/validate-config.shtemplates/config-starter.yaml詳細
グレースフルシャットダウン
目次
概要
プロセス終了前にすべてのリクエストを完了し、接続を閉じ、リソースを解放できるよう、適切なシャットダウン手順を実装します。
使用する場面
- Kubernetes/Docker のデプロイ
- ローリングアップデートとデプロイ
- サーバーの再起動
- ロードバランサーのドレイン期間
- ダウンタイムなしのデプロイ
- プロセスマネージャー(PM2、systemd)
- 長時間実行されるバックグラウンドジョブ
- データベース接続のクリーンアップ
クイックスタート
最小限の動作例:
import express from "express";
import http from "http";
class GracefulShutdownServer {
private app: express.Application;
private server: http.Server;
private isShuttingDown = false;
private activeConnections = new Set<any>();
private shutdownTimeout = 30000; // 30 seconds
constructor() {
this.app = express();
this.server = http.createServer(this.app);
this.setupMiddleware();
this.setupRoutes();
this.setupShutdownHandlers();
}
private setupMiddleware(): void {
// Track active connections
this.app.use((req, res, next) => {
if (this.isShuttingDown) {
res.set("Connection", "close");
return res.status(503).json({
error: "Server is shutting down",
// ... (see reference guides for full implementation)
リファレンスガイド
詳細な実装は references/ ディレクトリにあります:
| ガイド | 内容 |
|---|---|
| Express.js のグレースフルシャットダウン | Express.js のグレースフルシャットダウン |
| Kubernetes 対応のシャットダウン | Kubernetes 対応のシャットダウン |
| ワーカープロセスのシャットダウン | ワーカープロセスのシャットダウン |
| データベース接続プールのシャットダウン | データベース接続プールのシャットダウン |
| PM2 のグレースフルシャットダウン | PM2 のグレースフルシャットダウン |
| Python/Flask のグレースフルシャットダウン | Python/Flask のグレースフルシャットダウン |
ベストプラクティス
✅ 実施すること
- SIGTERM と SIGINT シグナルを処理する
- 新しいリクエストの受け付けを直ちに停止する
- 処理中のリクエストが完了するまで待機する
- 適切なシャットダウンタイムアウトを設定する
- データベース接続を適切に閉じる
- ログとメトリクスをフラッシュする
- シャットダウン中はヘルスチェックを失敗させる
- シャットダウン手順をテストする
- シャットダウンの進行状況をログに記録する
- コンテナではグレースフルシャットダウンを使用する
❌ 避けること
- シャットダウンシグナルを無視する
- クリーンアップせずにプロセスを強制終了する
- 不合理に長いタイムアウトを設定する
- リソースのクリーンアップを省略する
- 接続を閉じ忘れる
- シャットダウンを無期限にブロックする
コメント
Markdown 対応