版本: 1.0.3 跨平台: Linux ✅ + macOS ✅ (仅使用POSIX兼容调用)
作者: 猫经理(哈基咪公司)
更新日期: 2026-03-19
解决 Agent 执行任务时卡住、陷入死循环、进程无响应时,无法被用户主动终止的问题。
核心价值:
/stop 系统命令(会直接 abort agent 本身)与原版 Task Interrupt Skill 的区别:
维度原版Pro 版中断触发/stop(系统级,会 abort agent)普通消息("停止猫经理")目标需要 agent 主动轮询检查外部 kill PID,零依赖精确性停止所有子任务可针对特定 agent侵入性需要修改 agent 行为无侵入
当用户发送以下任意指令时激活:
停止猫经理 - 停止猫经理正在执行的任务停止猫工头 - 停止猫工头正在执行的任务停止猫财子 - 停止猫财子正在执行的任务停止猫播播 - 停止猫播播正在执行的任务停止我的任务 - 停止当前 agent 的任务解救猫经理 / 中断猫经理 - 同"停止猫经理"进程卡住了 / 任务无响应 - 需要强制终止时Do NOT use for:
/stop - 这是系统级 abort 命令,会直接终止 agent 本身,勿用!text
┌─────────────────────────────────────────────────────────────────────────┐
│ 用户发送指令 │
│ "停止猫经理" / "停止猫财子" / "停止猫工头" │
└────────────────────────────────┬────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ 主 Agent(我)接收消息 │
│ 识别关键词:"停止" + agent名称 │
│ 触发中断流程(优先级最高) │
└────────────────────────────────┬────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ handle-stop.sh 执行(三层保障) │
│ │
│ 第一层:创建 stop flag │
│ → /tmp/agent-stop-{SESSION_ID}.flag │
│ → 进程检测到 flag → 优雅退出(trap) │
│ │
│ 第二层:SIGINT 信号 │
│ → kill -INT {PID} │
│ → 进程 trap 捕获 → 优雅退出 │
│ │
│ 第三层:SIGKILL 兜底 │
│ → kill -9 {PID}(如前两层均失效) │
└────────────────────────────────┬────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ 清理 & 反馈 │
│ │
│ - PID 文件自动清理(/tmp/agent-pid-{SESSION_ID}.pid) │
│ - flag 文件 60 秒后自动清理 │
│ - 向用户返回中断结果 │
└─────────────────────────────────────────────────────────────────────────┘
subagent 任务模板(可中断任务):
bash
#!/bin/bash
SESSION_ID="maogongtou-$$" # 或 maocaizi, maobobo, main
FLAG_FILE="/tmp/agent-stop-${SESSION_ID}.flag"
PID_FILE="/tmp/agent-pid-${SESSION_ID}.pid"
# 记录 PID
echo $$ > "${PID_FILE}"
chmod 0600 "${PID_FILE}"
# 信号处理(收到 SIGINT/SIGTERM 时优雅退出)
trap 'echo "[TRAP] 收到停止信号"; rm -f "${PID_FILE}"; exit 0' SIGINT SIGTERM
# 主循环(每轮检查 flag)
while true; do
if [ -f "${FLAG_FILE}" ]; then
echo "[TRAP] 检测到 stop flag,优雅退出"
rm -f "${PID_FILE}"
exit 0
fi
# 实际任务逻辑
echo "工作中..."
sleep 3
done
路径: scripts/handle-stop.sh
功能:
用法:
bash
./handle-stop.sh <SESSION_ID> [reason]
示例:
bash
./handle-stop.sh "maocaizi-82161" "Chairman stop request"
./handle-stop.sh "maojingli-test-82363" "User request"
路径: scripts/task-template.sh
功能:
用法: 将此模板包裹实际任务逻辑
脚本路径功能create-stop-flag.shscripts/手动创建 stop flagcheck-stop-flag.shscripts/检查 flag 是否存在(含过期清理)clear-stop-flag.shscripts/手动清除 flag
bash handle-stop.sh <SESSION_ID> [reason]bash
# 步骤1:确定目标 session
# 用户说"停止猫财子" → 猫财子的任务 SESSION_ID
# 步骤2:调用中断脚本
bash scripts/handle-stop.sh "maocaizi-82161" "Chairman stop request"
# 步骤3:验证
# 检查 /tmp/agent-pid-maocaizi-82161.pid 是否被清理
# 检查对应 PID 是否已终止
# 步骤4:返回用户
"⏹️ 猫财子任务已停止,进程已终止"
用户输入: 停止猫财子
Agent 处理:
bash handle-stop.sh "maocaizi-<ID>" "Chairman stop request"输出:
text
⏹️ 猫财子任务已停止
SESSION_ID: maocaizi-82161
PID: 82161
状态: 已终止 ✅
用户输入: 猫经理任务卡住了,请停止
Agent 处理:
问题原因解决方案"未找到 PID 文件"进程已退出或 SESSION_ID 错误跳过 kill,提示用户进程可能已终止"进程未响应 SIGINT"进程处于不可中断状态自动升级到 SIGTERM → SIGKILL"Permission denied"无权限 kill 该进程提示用户需要更高权限
即使所有层都失效,仍可通过以下方式强制终止:
bash
# 直接 kill -9(强制终止)
kill -9 {PID}
来源: 大哥Gemini审核 + 猫经理自检
Bug文件严重性说明validate_process返回值错误handle-stop.sh🔴 高cmdline不匹配时返回0,调用方误判为成功并执行kill。改为返回2,跳过killFLAG_FILE符号链接攻击handle-stop.sh🔴 高创建flag文件前未检查符号链接,攻击者可覆盖任意文件。添加symlink检查REASON JSON注入handle-stop.sh🟡 中REASON写入JSON未转义。添加sed转义
场景旧行为(v1.0.3)新行为(v1.0.4)进程cmdline不含SESSION_ID返回0→调用方继续kill返回2→跳过killFLAG_FILE已是符号链接可能覆盖任意文件安全拒绝+退出REASON含特殊字符JSON结构破坏转义后安全写入
命令行校验优化:豆包建议,将"拒绝kill"改为"警告+跳过kill"。
场景旧行为(v1.0.2)新行为(v1.0.3)bash -c变量展开安全拒绝+不kill警告+跳过kill真实脚本格式正常kill正常kill
跨平台安全增强:整合Kimi+豆包建议,添加审计日志+格式校验+flock原子锁。
功能来源说明审计日志豆包建议所有操作记录到 /tmp/agent-interrupt-audit.logSESSION_ID严格格式豆包建议必须为 ^[a-z0-9]+-[a-z0-9]+$ 格式,拒绝非法格式flock原子锁Kimi建议PID文件读写使用flock防止竞争条件权限检查综合校验PID文件权限,防止权限过宽孤儿检测提示Kimi建议日志中包含进程验证详情
{name}-{id} 格式直接拒绝ClawHub安全扫描修复:安全扫描发现2个问题,已全部修复。
require('task-interrupt') 模块安全机制原风险修复方案PID文件类型检查符号链接攻击拒绝符号链接类型PID文件文件所有权验证其他用户伪造验证文件属于当前用户或root进程命令行验证误杀无关进程进程命令行必须包含SESSION_ID标识命令行注入防护特殊字符注入SESSION_ID清理(字母数字短横线)PID纯数字提取注入恶意PID提取纯数字PID分阶段SIGINT进程来不及优雅退出SIGINT后等待3秒再SIGTERM删除pgrep fallback盲目匹配误杀删除不安全的pgrep fallback
将 task-interrupt-pro 目录放入 agent 的 skills/ 目录:
bash
# 对于猫经理
cp -r task-interrupt-pro ~/.openclaw/viking-maojingli/skills/
# 对于猫工头
cp -r task-interrupt-pro ~/.openclaw/viking-maogongtou/skills/
# 对于猫财子
cp -r task-interrupt-pro ~/.openclaw/viking-maocaizi/skills/
# 对于猫播播
cp -r task-interrupt-pro ~/.openclaw/viking-maobobo/skills/
bash
chmod +x skills/task-interrupt-pro/scripts/*.sh
bash
# 检查脚本可执行
ls -la skills/task-interrupt-pro/scripts/*.sh
# 测试 handle-stop.sh(Dry run)
echo "test-session" > /tmp/agent-pid-test-session.pid
bash scripts/handle-stop.sh "test-session" "test"
作者: 猫经理(哈基咪公司)
版本: 1.0.0
日期: 2026-03-19
非常感谢开发者 @guyxlouspg 和他的猫小咪团队提供的一切思路和帮助及公布的开源成果,让我们哈基咪OPC公司能够顺利跑通整个流程,顺利开发了 Task Interrupt Pro!向前辈致敬!
Task Interrupt Pro - 哈基咪OPC公司首个Skill成果
开发日期: 2026-03-19