go-process-cli について
プロセスを管理する Go CLI の構築とレビューを支援するスキルです。シグナル、子プロセス、並行処理、コンテキスト、終了コードを扱い、プロセスを確実に起動・監督・終了する Go 開発者向けです。
主な機能
- 01SIGINTとSIGTERMの処理
- 02子プロセスとプロセスグループの管理
- 03並行数の制限とgoroutine漏れの防止
- 04コンテキストの伝播とキャンセル
- 05終了処理を保ったエラー集約
- 06CLIフラグとプロセス監督
活用シーン
- 01正常終了に対応するデーモンの実装
- 02ジョブランナーやプロセス監督ツールの構築
- 03外部コマンドを呼び出すテストハーネスの作成
- 04デプロイや移行用CLIの設計
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ pproenca/ dot-skills --skill go-process-cliインストール後、Claude Code で/go-process-cliを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
AGENTS.mdmetadata.jsonassets/templates/_template.mdreferences/_sections.mdcli-execute-context-wires-signals.mdcli-flag-vs-cobra-by-shape.mdcli-rune-return-errors.mdcli-stdlib-subcommand-pattern.mdctx-cancellable-wait.mdctx-defer-cancel.mdctx-explicit-argument.mderr-join-aggregate-workloads.mderr-run-function-for-deferred-cleanup.mdexec-cancel-sigterm-before-kill.mdexec-commandcontext-binds-lifetime.mdexec-exit-code-from-exiterror.mdexec-kill-process-group.mdexec-pipes-without-deadlock.mdsig-notify-context-for-shutdown.mdsig-second-signal-force-quit.mdstate-atomic-pidfile.mdstate-reap-children-wait.mdstate-signal-zero-liveness.mdstate-structured-slog-transitions.mdwork-bound-concurrency.mdwork-errgroup-fan-out.mdwork-every-goroutine-has-exit.mdwork-sender-closes-channel.md詳細
Go のプロセス管理 CLI
プロセスを正しく起動、監視、終了する Go のコマンドラインツールを作成します。標準ライブラリでは簡単に実装できる一方、細かな誤りが起きやすい部分です。
適用する場面
デーモン、プロセススーパーバイザー、ジョブ/ワーカー実行ツール、デプロイまたはマイグレーションツール、外部コマンドを実行するテストハーネスなど、他のプロセスや並行ワークロードを制御する Go CLI を構築またはレビューするときに、このスキルを活用してください。オーケストレーターから停止指示を受けたときに、クリーンに停止する必要があるプログラムも対象です。対象は Unix 系システム(Linux、macOS)上の Go 1.22+ です。いくつかのルールでは Windows との違いにも触れています。Go の知識があることを前提としており、この領域で誤りにつながる特定のデフォルトだけを修正します。
カテゴリ
| # | カテゴリ | プレフィックス | 対象範囲 |
|---|---|---|---|
| 1 | シグナルとグレースフルシャットダウン | sig | コンテキストと SIGINT/SIGTERM の紐付け、2 回目のシグナルによる強制終了 |
| 2 | 子プロセス | exec | os/exec のライフタイム、グレースフルな終了、プロセスグループ、パイプ、終了コード |
| 3 | 並行処理とワークロード | work | errgroup によるファンアウト、並行数の制限、ゴルーチンリーク対策、チャネルの所有権 |
| 4 | コンテキストの伝播 | ctx | 明示的なコンテキスト引数、defer cancel()、キャンセル可能な待機 |
| 5 | エラーと終了コード | err | 遅延クリーンアップのための run() error、エラーの集約 |
| 6 | CLI フレームワークとフラグ | cli | 標準ライブラリの flag と cobra、ExecuteContext、RunE、サブコマンドのパターン |
| 7 | プロセスの状態と監視 | state | 生存確認、アトミックな PID ファイル、ゾンビプロセスの回収、構造化ログ |
クイックリファレンス
このスキルで修正するデフォルトの動作を示します。
signal.NotifyContext(ctx, SIGINT, SIGTERM)— Ctrl-C だけを監視するチャネルではなく、こちらを使います。オーケストレーターは SIGTERM を送信します。exec.CommandContext+cmd.Cancel/cmd.WaitDelay— 通常のCommandContextはクリーンアップせずに子プロセスを SIGKILL で終了させます。Setpgid+kill(-pgid)— 直接の子プロセスだけにシグナルを送ると、孫プロセス(sh -c、make、npm)が孤児になります。- キャプチャには
cmd.Output()—Wait()の後にパイプを読み取るとデッドロックします。 errgroup.WithContext+SetLimit(n)— タスクごとにゴルーチンを作ると、タスクごとに プロセス が作られます。PID/FD が枯渇します。- 引数としての
ctx— 構造体のフィールドにはしません。派生したすべてのコンテキストでdefer cancel()を使います。 select { case <-ticker.C: case <-ctx.Done(): }—time.Sleepを使うと、シャットダウン時にインターバルが終わるまで待つことになります。main → run() error → os.Exit(1)— コードの深い場所でlog.Fatal/os.Exitを呼ぶと、すべてのdeferが実行されません。proc.Signal(syscall.Signal(0))— Unix ではos.FindProcessは常に成功するため、プロセスが生存している証明にはなりません。- PID ファイルには
os.OpenFile(O_CREATE|O_EXCL)— 確認してから作成する方法は競合状態になります。ゾンビ化を防ぐため、すべての子プロセスでcmd.Wait()を呼びます。
使い方
- タスクがどのカテゴリに該当するかを確認します(上の表を参照)。
references/にある該当ルールのファイルを読みます。それぞれのファイルでは、修正対象となる誤ったデフォルトの動作を示した、焦点を絞った自己完結型のパターンを説明しています。- パターンを適用し、各ルールの
Referenceリンクから信頼できる情報源を確認します。
ルール同士は相互にリンクしています(たとえば、グレースフルシャットダウンはシグナル → コンテキスト → 子プロセスの終了 → クリーンアップと関連します)。複数のカテゴリにまたがるタスクでは、リンク先も確認してください。
このスキルを拡張するときは、assets/templates/_template.md をコピーします。まず WHY を説明し、現実的な名前を使った典型例を 1 つ示します。誤った方法が本当に危険な場合に限り、比較例も加えます。
情報源の信頼性
各ルールでは一次情報源を引用しています。pkg.go.dev の Go 標準ライブラリリファレンス、公式 Go ブログ(go.dev/blog)、および cobra のドキュメントです。いずれもメンテナーが作成した、バージョンが最新の情報源を選んでいます。コンテンツファーム、まとめ記事、日付の記載がないチュートリアルは使用していません。
関連スキル
radical-simplification— スーパーバイザーの設計に、意図しない複雑さが積み重なっている場合に使用します。unix-cli/cli-for-agents— プロセス管理以外も含む、より幅広い CLI の使いやすさを扱います。