/loop与Skills的配合使用

/loop与Skills结合实现定时自动化

一、/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的参数。有两种占位符语法:

# 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意味着:无论执行一次还是一百次,最终状态都是一致的,不会产生副作用累积。这在以下场景中尤为重要:

# 幂等设计示例 # 非幂等(不安全): # 每次循环都追加一条记录到数据库 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,你可以将精力集中在更重要的决策和问题处理上。