Snakemake提交HTCondor任务:日志文件被提前删除的问题求助
Snakemake+HTCondor日志文件冲突解决方案
问题背景
规则B依赖规则A生成的HTCondor集群日志文件(包含内存使用、磁盘占用、运行时长等元数据),当前存在以下冲突:
- HTCondor会在任务提交后、运行前提前创建
.log文件 - Snakemake执行规则A时,会预先删除所有声明的输出文件,导致提前生成的
.log被删除,任务失败且元数据丢失 .out文件不受影响,因为集群仅在任务完成后创建它
期望行为:规则执行后保留.log文件,且旧日志在任务提交前被删除,确保文件仅包含单次任务的元数据。
用户提供的规则示例:
rule A: input: input.file output: output.file rule_A.log rule_A.out rule B: input: rule_A.log
最小复现示例:
rule make_files: input: input_file.dat output: output_file.dat condor_logs.log shell: """ source script {input} """
注:script仅处理输入生成输出,不会显式生成condor_logs.log,该文件由HTCondor在任务入队时自动生成。
可行解决方案
Snakemake没有直接的“执行前不删除特定输出文件”配置,但可以通过以下方式实现需求:
方法1:使用protected标记日志文件
将.log文件放到规则的log字段,并标记为protected,这样Snakemake在执行规则前不会删除它;同时在shell脚本开头手动删除旧日志,确保仅保留单次任务数据。
修改后的规则示例:
rule make_files: input: "input_file.dat" output: "output_file.dat" log: protected("condor_logs.log") shell: """ # 任务提交前删除旧日志 rm -f {log} source script {input} """
protected属性会阻止Snakemake在规则执行前删除该日志文件- 手动执行
rm -f {log}确保旧日志被清理,符合“仅含单次任务信息”的要求
方法2:绕过Snakemake的文件管理(不推荐)
如果不想使用log字段,也可以将.log文件从规则的output/log字段中移除,在脚本中手动指定日志路径,同时在规则B中通过shell命令检查日志文件是否存在。但这种方法会破坏Snakemake的依赖管理逻辑,仅作为临时替代方案。
内容的提问来源于stack exchange,提问作者Luka
相关产品推荐
相关产品推荐

