Snakemake集群提交:如果日志文件是规则输出,则在作业运行时删除日志文件

问题描述 投票:0回答:1

我有一个规则 B,它依赖于先前规则 A 创建的日志文件。这些日志文件是由我提交到的集群 (HTCondor) 创建的。这些日志包含集群调度程序正在收集的信息,例如内存使用情况、磁盘使用运行时间等。我的小组正在使用一些脚本来评估此“元数据”,并且我有另一个应该运行这些脚本的规则。

现在来说说我遇到的问题。作业一提交,但在作业本身实际启动之前,集群就会创建 .log 文件。现在,几秒钟后,作业 A 启动并立即删除 .log 文件,因为规则会在重新创建之前删除其输出。这会导致规则失败,因为不会重新创建 .log(并且在任何情况下,此时我需要的信息已经丢失)。

我期望的行为会导致 .log 在规则完成后存在,并在作业提交开始之前删除它的旧实例,以便它只包含单个作业提交的日志。对于 .out 文件,这是有效的,因为集群仅在作业完成后创建它。

rule A:
    input:
        input.file
    output:
        output.file
        rule_A.log
        rule_A.out
rule B:
   input:
        rule_A.log

我不知道如何获得所需的行为,有什么方法可以用snakemake做到这一点吗?允许我定义在执行之前不应删除的输出的选项是理想的。

我还尝试将rule_A.log放入规则A的日志部分,但这显示了相同的行为。

python snakemake htcondor
1个回答
0
投票

我对在重新创建输出之前删除其输出的规则有点困惑。你能分享一个可重现的例子吗?或者你的实际规则A?我做了这个,我认为它重现了你的场景:

def create_log_file(wc):
    with open("a.log", "w") as f:
        f.write("hello world")
    return []


rule all:
    input:
        "b.out",


rule a:
    input:
        create_log_file, # simulate writing log file before execution
    output:
        out="a.out",
        log="a.log",
    shell:
        """
        echo a > {output.out}
        """


rule b:
    input:
        rules.a.output.log,
    output:
        "b.out",
    shell:
        "cat {input} > {output}"

运行后,b.out 中包含“hello world”。

© www.soinside.com 2019 - 2024. All rights reserved.