概述
ssh-long-task 用于管理预计耗时超过 2 分钟的远程任务,通过 checkpoint 机制支持 agent 休息和跨会话恢复。
适用场景
- 模型训练(超过 10 分钟)
- 大规模数据处理
- 编译构建任务
- 数据库迁移
使用流程
1. 启动任务并写入 checkpoint
使用 connect/scripts/ssh-job.sh start 启动任务,获取 job_id 后立即写入 checkpoint:
connect/scripts/ssh-job.sh start <profile> "<command>"
# 输出: 任务已启动: job-20260306-143022-1234
long-task/scripts/checkpoint.sh write <profile> <job_id> \
--task "模型训练 epoch 50" \
--duration "~2h" \
--next "检查训练完成,下载模型权重,运行验证" \
--context "lr=0.001,batch=32"
产出为 checkpoint 文件:~/.ssh-jobs/<job_id>/checkpoint.md
2. 告知用户并休息
Agent 输出示例:任务已启动、checkpoint 已保存及预计耗时,并说明用户可以稍后输入“检查任务 <job_id>”查看状态、关闭会话后任务继续运行、新会话中会自动读取 checkpoint 恢复上下文。
3. 恢复时读取 checkpoint
新会话或用户请求检查时执行:
long-task/scripts/checkpoint.sh read <profile> <job_id>
产出为解析后的 checkpoint 内容(task、started、duration、next_steps、context)。
4. 智能状态检查
根据预计耗时决定检查策略:
connect/scripts/ssh-job.sh status <profile> <job_id>
- 少于 5 分钟:每 30 秒检查一次
- 5 至 30 分钟:每 2 分钟检查一次
- 超过 30 分钟:每 10 分钟检查一次,或由用户手动触发
5. 输出检查(Token 优化)
先查询输出大小:
connect/scripts/ssh-job.sh status <profile> <job_id>
# 输出: stdout: 245KB, stderr: 1.2KB
按大小决策读取方式:
- 小于 10KB:读取全部
connect/scripts/ssh-job.sh output <profile> <job_id>
- 10KB 至 100KB:只读尾部
connect/scripts/ssh-job.sh output <profile> <job_id> --tail 50
- 大于 100KB:先搜索错误
connect/scripts/ssh-job.sh output <profile> <job_id> --grep 'error|fail|exception'
6. 执行 next_steps
任务完成后,按 checkpoint 中的 next_steps 继续,逐步执行,每步完成后更新 checkpoint 或删除。
Checkpoint 格式
存储在 ~/.ssh-jobs/<job_id>/checkpoint.md:
job_id: job-20260306-143022-1234
profile: dev-server
task: "模型训练 epoch 50"
started: 2026-03-06T14:30:22
expected_duration: ~2h
next_steps:
- 检查训练完成状态
- 下载模型权重到本地
- 运行验证脚本
context: "learning_rate=0.001, batch_size=32"
Token 约束
- 输出检查:先查大小,按大小分级读取(全部、尾部或 grep)
- 状态轮询:根据预计耗时调整频率,避免频繁检查
- Checkpoint 内容:精简关键信息,不存储完整日志