关于 go-process-cli
为构建和审查 Go 进程管理命令行工具提供规则技能,涵盖信号处理、子进程、并发、上下文和退出码。面向需要启动、监督并可靠关闭进程的 Go 开发者。
主要功能
- 01处理 SIGINT 与 SIGTERM
- 02管理子进程生命周期和进程组
- 03限制并发并避免 goroutine 泄漏
- 04传播 context 并支持取消
- 05通过清理流程汇总错误
- 06覆盖 CLI 标志与进程监督
适用场景
- 01实现可优雅关闭的守护进程
- 02构建作业运行器或进程监督器
- 03编写调用外部命令的测试工具
- 04设计部署或迁移命令行工具
安装
复制下面的命令,在终端中运行。
$
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 时,请使用此技能:例如守护进程、进程监管器、作业/工作器运行器、部署或迁移工具、调用外部命令的测试框架,或任何必须在编排器发出指令时干净退出的程序。适用范围是 Go 1.22+ 和 类 Unix 系统(Linux、macOS);部分规则会说明 Windows 上的差异。假设你已经熟悉 Go——此技能只纠正这个领域中特定的错误默认做法。
类别
| # | 类别 | 前缀 | 涵盖内容 |
|---|---|---|---|
| 1 | 信号与优雅关闭 | sig | 将上下文绑定到 SIGINT/SIGTERM;第二次收到信号时强制退出 |
| 2 | 子进程 | exec | os/exec 生命周期、优雅终止、进程组、管道、退出码 |
| 3 | 并发与工作负载 | work | errgroup 并发分发、限制并发数、避免 goroutine 泄漏、通道所有权 |
| 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)——每个任务启动一个 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(),否则会变成僵尸进程。
使用方法
- 确定你的任务属于哪个类别(见上表)。
- 阅读
references/中相关规则文件——每个文件都聚焦于一种模式,并指出要纠正的错误默认做法。 - 应用该模式;点击每条规则中的
Reference链接查看权威来源。
规则之间有交叉引用(例如,优雅关闭涉及信号 → 上下文 → 子进程终止 → 清理),因此任务涉及多个类别时,请沿链接继续阅读。
扩展此技能时,请复制 assets/templates/_template.md:先说明 WHY,提供一个使用真实名称的规范示例;只有在错误做法确实容易踩坑时才加入对照示例。
来源权威性
每条规则都引用了主要来源——pkg.go.dev 上的 Go 标准库参考文档、Go 官方博客(go.dev/blog)和 cobra 文档。这些来源由维护者编写,并且与当前版本相符。不会引用内容农场、清单式文章或未标注日期的教程。
相关技能
radical-simplification——当监管器设计累积了意外的复杂性时使用。unix-cli/cli-for-agents——了解进程管理之外更广泛的 CLI 易用性。
评论
支持 Markdown