mcpField
G
go-process-cli

go-process-cli

github.com/pproenca开发218107 次安装11 周前更新
代码仓库

关于 go-process-cli

为构建和审查 Go 进程管理命令行工具提供规则技能,涵盖信号处理、子进程、并发、上下文和退出码。面向需要启动、监督并可靠关闭进程的 Go 开发者。

主要功能

  1. 01处理 SIGINT 与 SIGTERM
  2. 02管理子进程生命周期和进程组
  3. 03限制并发并避免 goroutine 泄漏
  4. 04传播 context 并支持取消
  5. 05通过清理流程汇总错误
  6. 06覆盖 CLI 标志与进程监督

适用场景

  1. 01实现可优雅关闭的守护进程
  2. 02构建作业运行器或进程监督器
  3. 03编写调用外部命令的测试工具
  4. 04设计部署或迁移命令行工具

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/pproenca/dot-skills --skill go-process-cli

安装后在 Claude Code 中输入/go-process-cli确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

AGENTS.md
metadata.json
assets/templates/
_template.md
references/
_sections.md
cli-execute-context-wires-signals.md
cli-flag-vs-cobra-by-shape.md
cli-rune-return-errors.md
cli-stdlib-subcommand-pattern.md
ctx-cancellable-wait.md
ctx-defer-cancel.md
ctx-explicit-argument.md
err-join-aggregate-workloads.md
err-run-function-for-deferred-cleanup.md
exec-cancel-sigterm-before-kill.md
exec-commandcontext-binds-lifetime.md
exec-exit-code-from-exiterror.md
exec-kill-process-group.md
exec-pipes-without-deadlock.md
sig-notify-context-for-shutdown.md
sig-second-signal-force-quit.md
state-atomic-pidfile.md
state-reap-children-wait.md
state-signal-zero-liveness.md
state-structured-slog-transitions.md
work-bound-concurrency.md
work-errgroup-fan-out.md
work-every-goroutine-has-exit.md
work-sender-closes-channel.md

详细介绍

Go 进程管理 CLI

构建 Go 命令行工具,以正确的方式启动、监控和关闭进程——这部分标准库很容易让人不知不觉地处理错误。

适用场景

当你要构建或审查一个用于控制其他进程或并发工作负载的 Go CLI 时,请使用此技能:例如守护进程、进程监管器、作业/工作器运行器、部署或迁移工具、调用外部命令的测试框架,或任何必须在编排器发出指令时干净退出的程序。适用范围是 Go 1.22+ 和 类 Unix 系统(Linux、macOS);部分规则会说明 Windows 上的差异。假设你已经熟悉 Go——此技能只纠正这个领域中特定的错误默认做法。

类别

#类别前缀涵盖内容
1信号与优雅关闭sig将上下文绑定到 SIGINT/SIGTERM;第二次收到信号时强制退出
2子进程execos/exec 生命周期、优雅终止、进程组、管道、退出码
3并发与工作负载workerrgroup 并发分发、限制并发数、避免 goroutine 泄漏、通道所有权
4上下文传播ctx显式传递上下文参数、defer cancel()、可取消的等待
5错误与退出码err用 run() error 执行延迟清理、汇总失败
6CLI 框架与标志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)——每个任务启动一个 goroutine,也意味着每个任务启动一个进程:可能耗尽 PID/文件描述符。
  • 将 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 总会成功;它不能证明进程仍在运行。
  • 使用 os.OpenFile(O_CREATE|O_EXCL) 创建 PID 文件——先检查再创建会有竞态;每个子进程都必须调用 cmd.Wait(),否则会变成僵尸进程。

使用方法

  1. 确定你的任务属于哪个类别(见上表)。
  2. 阅读 references/ 中相关规则文件——每个文件都聚焦于一种模式,并指出要纠正的错误默认做法。
  3. 应用该模式;点击每条规则中的 Reference 链接查看权威来源。

规则之间有交叉引用(例如,优雅关闭涉及信号 → 上下文 → 子进程终止 → 清理),因此任务涉及多个类别时,请沿链接继续阅读。

扩展此技能时,请复制 assets/templates/_template.md:先说明 WHY,提供一个使用真实名称的规范示例;只有在错误做法确实容易踩坑时才加入对照示例。

来源权威性

每条规则都引用了主要来源——pkg.go.dev 上的 Go 标准库参考文档、Go 官方博客(go.dev/blog)和 cobra 文档。这些来源由维护者编写,并且与当前版本相符。不会引用内容农场、清单式文章或未标注日期的教程。

相关技能

  • radical-simplification——当监管器设计累积了意外的复杂性时使用。
  • unix-cli / cli-for-agents——了解进程管理之外更广泛的 CLI 易用性。

评论

支持 Markdown