一、/loop与Skills的结合模式
/loop命令是Claude Code中用于按固定时间间隔重复执行某个命令或Skill的功能。当/loop与自定义Skills配合使用时,可以实现高度自动化的定时工作流。这种结合模式的核心优势在于将"定时触发"与"预定义逻辑"分离,使两者各自专注于自己的职责。
/loop调用Skill = 定时执行预定义命令
/loop作为定时触发器,Skill作为执行单元。每次循环到达时间间隔时,/loop会自动调用指定的Skill,Skill执行完毕后等待下一个周期。
Skill提供稳定可靠的执行逻辑
Skill经过预先定义和调试,包含完整的执行流程、错误处理和输出格式化逻辑,确保每次循环执行的结果一致可靠。
适合定期检查和报告的场景
服务器健康检查、数据同步状态监控、定时任务执行情况报告、日志分析汇总等需要周期性执行的场景尤为适合。
将/loop与Skill结合使用,本质上是在建立一种"自动化巡检"机制。你无需手动重复输入相同的命令,也不需要记住复杂的参数组合。Skill封装了所有逻辑细节,/loop负责按时驱动,你只需要观察每次执行的结果即可。
核心思路: /loop解决"何时执行"的问题,Skill解决"执行什么"的问题。两者结合,你只需要关注"结果是否符合预期"。
这种模式特别适合需要在长时间内持续监控的场景。例如,在CI/CD流水线部署过程中,你可以使用/loop定时调用检查状态的Skill,直到部署完成;在夜间数据处理任务中,可以用/loop自动轮询处理进度并汇总结果,第二天早上直接查看报告。
二、定义可循环的Skill
并非所有Skill都适合被/loop循环调用。在设计供/loop使用的Skill时,需要充分考虑循环执行的特殊性。一个优秀的可循环Skill应当具有以下特征:
Skill设计考虑循环执行的特点
循环执行的Skill每次调用都是独立的——/loop不会在两次调用之间维护状态。因此,Skill应当自包含:每次执行时自己获取所需的信息,不依赖上一次执行的内存状态。如果需要跨轮次传递信息,应当通过外部存储(如文件系统或环境变量)来实现。
# 自包含的Skill示例:检查服务健康状态
# 每次执行独立获取最新状态,不依赖历史调用
/health_check
# Skill内部逻辑:
# 1. 发送HTTP请求到目标服务健康检查端点
# 2. 解析响应状态码和响应时间
# 3. 输出格式化的健康检查报告
输出格式清晰便于多次结果对比
循环Skill的输出应当结构化且一致,以便你快速对比多次执行的结果。建议采用列表、表格或固定格式的文本输出,每次输出的字段和顺序保持一致。这样在查看历史输出时,可以一眼看出哪些指标发生了变化。
# 推荐输出格式示例:
# 每次执行输出固定字段,便于对比
[2026-05-08 10:00:00] 健康检查报告
- 服务状态: 正常 (200 OK)
- 响应时间: 125ms
- 内存使用: 67%
- 磁盘使用: 42%
[2026-05-08 10:05:00] 健康检查报告
- 服务状态: 正常 (200 OK)
- 响应时间: 312ms ← 明显增加
- 内存使用: 84% ← 持续上升
- 磁盘使用: 42%
包含时间戳和状态标记
每次Skill输出都应当包含明确的时间戳,标注本次执行的具体时间。此外,建议加入状态标记(如"正常"、"警告"、"异常"),帮助快速识别当前状况。时间戳精确到秒即可,状态标记建议使用统一的关键词便于后续搜索和过滤。
避免需要交互输入
/loop执行Skill时是非交互模式,Skill不能等待用户输入。任何需要交互确认的逻辑都不适合放在循环Skill中。如果确实需要决策分支,应当在Skill中预设条件判断逻辑,根据运行时状态自动选择执行路径,而不是弹出提示等待用户选择。
注意: 如果Skill中包含交互式确认步骤,/loop会卡住等待输入,导致循环无法继续进行。设计循环Skill时,务必移除所有需要用户输入的操作。
三、传递参数给循环Skill
/loop支持在调用Skill时传递参数,这为实现灵活可配的循环任务提供了基础。参数传递有以下几种方式:
直接传递参数
在/loop命令中,直接在Skill名称后面附加参数。参数会原样传递给Skill,每次循环使用相同的参数值。
# 基本用法:每5分钟检查一次特定服务
/loop 5m /check_service --endpoint https://api.example.com/health --timeout 30
# 每10分钟检查磁盘使用情况,指定阈值
/loop 10m /disk_usage --path /data --warning-threshold 80 --critical-threshold 95
Skill中使用参数占位符
在Skill的定义中,可以使用占位符引用传递给Skill的参数。有两种占位符语法:
- 位置参数: 使用
{{1}}、{{2}} 等引用第N个参数
- 命名参数: 使用
{{name}} 引用名为 --name 的参数值
# Skill定义示例(skill.yaml 或 CLAUDE.md 中定义)
name: check_service
description: 检查指定服务端点的健康状态
parameters:
- name: endpoint
required: true
description: 目标服务URL
- name: timeout
default: 30
description: 超时秒数
# 调用方式:
# /loop 5m /check_service --endpoint {{endpoint}} --timeout {{timeout}}
# 在Skill内部通过 {{endpoint}} 和 {{timeout}} 引用参数值
参数在每次循环中保持一致
/loop的一个关键特性是:所有参数在循环开始时被解析一次,后续每次循环都使用相同的参数值。这意味着即使参数中包含动态表达式(如时间戳),也只在循环开始时求值一次。如果需要每次循环都获取最新的动态值,应当在Skill内部处理,而不是依赖/loop的参数求值。
通过环境变量传递动态参数
对于需要在每次循环中获取不同值的参数,可以通过环境变量来实现。在Skill中读取环境变量,环境变量的值可以在每次执行时动态变化。
# 通过环境变量传递动态参数
# 在Skill内部读取环境变量
name: report_generator
description: 生成当前状态的汇总报告
# Skill内部逻辑使用环境变量:
# CURRENT_TIME=$(date +"%Y-%m-%d %H:%M:%S") # 每次执行时获取最新时间
# REPORT_ID=${REPORT_ID:-default} # 从环境变量读取
# 调用时设置环境变量:
# REPORT_ID=prod-123 /loop 5m /report_generator
提示: 如果你想在每次循环中传入不同的参数值,最佳实践是在Skill内部动态计算这些值,而不是试图让/loop在每次迭代时改变参数。
四、结果汇总与通知
循环Skill产生的价值不仅在于单次执行的结果,更在于多次执行结果累积形成的时间序列数据。如何有效地汇总和分析这些结果,是充分发挥/loop + Skills威力的关键。
每次循环执行的结果输出
/loop每次调用Skill后,会将Skill的完整输出展示在终端中。如果你希望持久化这些结果,应在Skill中实现输出到文件的逻辑,或者使用管道将结果重定向。
# Skill内部持久化结果到日志文件
name: log_check
description: 执行检查并将结果追加到日志文件
# Skill内部实现:
# 1. 执行检查逻辑
# 2. 构造格式化的结果字符串
# 3. 追加写入到 /var/log/checks/check-$(date +%Y%m%d).log
# 4. 同时在终端输出摘要
多次结果的对比和趋势分析
通过将每次循环的结果输出到结构化日志(如CSV或JSON格式),你可以轻松地进行趋势分析。示例数据格式:
# 结构化日志格式 (check_results.csv)
timestamp,service,status,response_time_ms,memory_pct
2026-05-08T10:00:00,api.example.com,OK,125,67
2026-05-08T10:05:00,api.example.com,OK,132,69
2026-05-08T10:10:00,api.example.com,OK,198,74
2026-05-08T10:15:00,api.example.com,OK,312,84
2026-05-08T10:20:00,api.example.com,DEGRADED,1500,92
# 通过对比可以观察到:
# - 响应时间从125ms逐步上升到1500ms
# - 内存使用从67%持续增加到92%
# - 服务状态从正常变为降级
变化检测:何时状态发生了变化
循环Skill的一个重要应用场景是变化检测。通过比较本次结果与上次结果(或基准线),自动识别状态变化。这要求Skill在每次执行时能够访问前一次的执行结果,通常通过读取持久化文件来实现。
# 变化检测逻辑示例(在Skill内部实现)
# 1. 读取上一次的结果文件(如果存在)
# 2. 执行本次检查
# 3. 将本次结果与上次结果对比
# 4. 如果有关键指标的变化超过阈值,输出告警标记
# 输出示例:
[CHANGE DETECTED] 响应时间从125ms上升至1500ms (+1100%)
[CHANGE DETECTED] 内存使用从67%上升至92% (+25个百分点)
[STATUS CHANGE] 服务状态从 OK 变为 DEGRADED
异常时的告警通知
当循环Skill检测到异常状态时,除了在终端输出告警信息,还可以集成外部通知机制,确保相关人员及时获知。
终端输出告警
使用醒目的颜色标记和警告符号在终端直接显示异常信息,适合实时观察终端输出的场景。
文件系统告警
将异常事件写入专门的告警日志文件,便于后续审计和排查。可以按天或按小时分割告警日志。
外部通知集成
在Skill中调用外部API发送通知,如钉钉/企业微信机器人消息、邮件通知、PagerDuty告警等。
# 外部通知集成示例(在Skill中调用webhook)
# 当检测到异常时,发送通知到企业微信机器人
ALERT_WEBHOOK="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY"
curl -s -X POST "$ALERT_WEBHOOK" \
-H "Content-Type: application/json" \
-d '{
"msgtype": "text",
"text": {
"content": "[告警] 服务异常检测\n服务: api.example.com\n状态: DEGRADED\n响应时间: 1500ms\n时间: 2026-05-08 10:20:00"
}
}'
五、最佳实践
基于对/loop与Skill配合使用的深入理解,以下最佳实践将帮助你构建稳定高效的循环自动化工作流。
Skill保持轻量快速执行
/loop的时间间隔是基于Skill执行完成后开始计时的。如果Skill执行时间过长,实际循环间隔会大于设置的时间间隔。因此,循环Skill应尽量轻量,确保在时间间隔内能完成执行。通用建议:单个循环Skill的执行时间不应超过循环间隔的50%。
建议: 如果循环间隔设为5分钟,Skill本身的执行时间应控制在2.5分钟以内。对于需要长时间执行的任务,考虑拆分为多个短任务用不同的/loop分别触发。
避免在循环Skill中进行耗时操作
以下操作不适合放在循环Skill中:大文件下载、全量数据库备份、大规模数据处理、编译构建等。这些操作应当作为独立的一次性任务运行,或者使用专门的调度系统(如cron job)管理。如果确实需要在循环中处理数据,可以采用增量处理策略:每次只处理上次检查以来新增的数据。
设计幂等的Skill确保重复安全
幂等性是循环Skill最重要的设计原则之一。一个幂等的Skill意味着:无论执行一次还是一百次,最终状态都是一致的,不会产生副作用累积。这在以下场景中尤为重要:
- 数据写入: 使用"有则更新、无则插入"的UPSERT语义,而不是每次都INSERT
- 状态设置: 每次执行都显式设置状态,避免"仅当条件满足时设置"的不确定逻辑
- 资源创建: 先检查资源是否存在,存在则跳过或更新,不存在则创建
- 通知发送: 记录已通知的事件ID,避免重复发送相同的告警
# 幂等设计示例
# 非幂等(不安全):
# 每次循环都追加一条记录到数据库
INSERT INTO check_log (timestamp, status) VALUES (NOW(), 'OK');
# 幂等(安全):
# 使用UPSERT语义,同一时间点只有一条记录
INSERT INTO check_log (timestamp, status) VALUES (NOW(), 'OK')
ON DUPLICATE KEY UPDATE status = 'OK';
添加退出条件避免无限循环
许多循环场景需要设定明确的退出条件。例如:等待部署完成、等待某个文件生成、等待外部服务就绪。在这些场景中,Skill应当包含退出条件判断逻辑:当条件满足时,执行清理操作并主动退出,或者输出明确的"任务完成"标记。
# 包含退出条件的循环Skill示例
name: wait_deploy
description: 轮询部署状态,直到部署完成或超时
# 执行逻辑:
# 1. 调用部署状态API
# 2. 如果状态为 "completed" → 输出成功信息并退出
# 3. 如果状态为 "failed" → 输出失败信息并退出
# 4. 如果状态为 "running" → 输出当前进度,继续等待
# 5. 检查是否超过最大等待次数 → 超时则输出超时告警并退出
# 与/loop配合:
# /loop 30s /wait_deploy --deploy-id dep-12345 --max-retries 60
核心要点: /loop与Skills的配合使用,本质上是在构建"定时触发 + 封装逻辑 + 结果积累"的自动化闭环。设计良好的循环Skill应当是轻量的、幂等的、自包含的,并且包含退出条件和异常通知机制。通过将重复性监控和检查任务交给/loop + Skills,你可以将精力集中在更重要的决策和问题处理上。