Bioinformatics Log Resume
概述
使用这个 skill 为生物信息学多样本批处理脚本添加或审查断点续跑。该 skill 采用固定的日志驱动协议,只允许通过 log/ 下的日志文件判断样本是否已完成,禁止通过扫描输出目录、结果文件或中间文件来推断完成状态。
固定协议
始终遵循以下规则:
- 在项目脚本启动时创建
log/目录。 - 在
log/下固定使用log/.resume.lock、log/success.log、log/fail.log。 - 每个样本执行结束后立刻写日志,不能批量补写。
- 只从
success.log第一列的样本 ID 判断是否完成。 fail.log只记录失败历史,不作为下次运行时的跳过依据。- 如果样本同时出现在
success.log和fail.log,以成功为准,下次运行跳过。 - 并行场景必须对日志写入加锁,避免多个进程竞争写文件。
- 明确禁止扫盘,不能通过输出目录、结果文件、flag 文件或文件大小判断样本是否已完成。
实施流程
按以下顺序组织实现:
- 识别样本循环的位置,以及样本 ID 的唯一来源。
- 确定项目根目录,设置
LOG_DIR、LOCK_FILE、SUCCESS_LOG、FAIL_LOG。 - 在主控脚本开始阶段执行
mkdir -p "$LOG_DIR"并初始化日志文件。 - 在正式处理样本前,从
success.log第一列读取已完成样本集合。 - 每次准备处理样本时,只检查该样本是否已在已完成集合中;如果在,则跳过。
- 样本成功完成后,在锁保护下向
success.log追加sample_id<TAB>timestamp。 - 样本失败后,在锁保护下向
fail.log追加sample_id。 - 审查并删除任何基于输出文件存在性、输出目录扫描或结果文件完整性的完成判定逻辑。
Shell 实现要求
- 优先面向
bash或兼容 shell 的主控脚本。 - 默认使用
flock操作log/.resume.lock。 - 成功日志使用
sample_id<TAB>timestamp格式,时间戳推荐date -Iseconds。 - 失败日志默认只写样本 ID;如果需要附加错误信息,应另建独立诊断日志,不要改变
fail.log作为失败样本列表的职责。 - 失败样本默认在下次运行时继续重试,只要其样本 ID 不在
success.log中。 - 默认采用 continue-on-error 的逐样本处理方式,不因单一样本失败而直接让整个批处理退出;只有用户明确要求 fail-fast 时才改变该策略。
审查清单
交付前逐项核查:
- 是否只依赖
success.log判断完成状态。 - 是否完全禁止扫盘判断完成。
- 是否每个样本结束后立刻写日志。
- 是否所有日志追加都受锁保护。
- 是否失败样本默认会在后续运行中重试。
- 是否存在样本 ID 重复匹配、模糊匹配或部分匹配问题。
- 是否把日志目录错误地放在
output/内。
参考资料
- 日志协议:读取
references/log-contract.md - Shell 模式与反例:读取
references/shell-patterns.md