snakemake 能否在 SLURM 集群上自动创建作业错误和输出文件?

Can snakemake create job error and output files automatically on a SLURM cluster?

我在 GNU/Linux Ubuntu 16.04.5.

工作

我在 Snakefile 中有以下规则:

rule cutadapt:
    input:
        reads = '{path2reads}/raw/reads.fq
    output:
        trimmed = '{path2reads}/trimmed/reads.fq
    shell:
        "cutadapt -q 20 --minimum-length 40 --output {output.trimmed} {input.reads}"

然后,在我的 slurm.json 文件中,我有:

...
    "output": "output/log/job/output/{rule}%A.o",
    "error": "output/log/job/error/{rule}%A.e",
...

在 Snakefile 中,我创建了文件夹 output/log/job/{error,output}

这很好用,大概是因为 snakemake 不必创建新文件夹来存储作业的错误和输出,我 运行 是这样的:

snakemake output/reads/trimmed/reads.fq --cluster-config slurm.json --cluster "sbatch ... --output {cluster.output} --error {cluster.error} ..."

因此 path2reads 将被计算为 output/reads

请注意,我省略了我认为与本次讨论无关的参数。

但是,我希望 SLURM 将我的结果存储在文件夹 output/lob/job/error/{rule}{wildcards}.eoutput/lob/job/output/{rule}{wildcards}.o 中。如果我将这些文件夹放入我的 slurm.json 文件中,作业就会失败。此结构 ...{rule}{wildcards}... 适用于不需要创建新文件夹的其他规则(因为通配符不包含文件夹路径`。

我怎样才能解决这个问题?我知道我可以事先找出所有文件夹并在 运行ning snakemake 之前创建它们,但这似乎效率不高。 snakemake 中没有为我做这个的功能吗?毕竟,snakemake 会创建所有不存在的输出、基准和日志文件夹。为什么它不对 SLURM 错误和输出文件执行此操作?

2019 年 4 月 24 日更新基于 Johannes Koester 的回复:

我已将规则更改为:

rule cutadapt:
    input:
        reads = '{path2reads}/raw/reads.fq
    output:
        trimmed = '{path2reads}/trimmed/reads.fq
    log:
        output = 'output/log/snakemake/output/cutadapt/path2reads={path2reads}.o',
        error = 'output/log/snakemake/error/cutadapt/path2reads={path2reads}.e',
        jobError = 'output/log/job/error/cutadapt/path2reads={path2reads}.e',
        jobOutput = 'output/log/job/output/cutadapt/path2reads={path2reads}.o',
    shell:
        'cutadapt -q 20 --minimum-length 40 --output {output.trimmed} {input.reads} > {log.output} 2> {log.error}'

和运行以下snakemake命令:

snakemake paths/2/reads/trimmed/reads.fq --cluster-config slurm.json --cluster "sbatch ... --output {cluster.output} --error {cluster.error} ..."

我的作业失败了,一些日志目录丢失了。我看到目录 output/log/job/{error,output} 但它们是空的。我没有看到目录 output/log/snakemake。但是,如果我首先创建目录 output/log/{job,snakemake}/{error,output}/cutadapt/path2reads=path/2/reads/,那么作业就会成功。

如果我在头节点上运行 snakemake,它也可以。注意我的 slurm.json 有以下 fastqc 参数(默认参数未显示):

"fastqc" :
      {
          "output" : "output/log/job/output/{rule}/{wildcards}.o",
          "error"  : "output/log/job/error/{rule}/{wildcards}.e"
      },

你知道哪里出了问题吗?

无法通过 snakemake 确保这一点。然而,如果你使用 snakemake 本身的日志记录支持,这个问题根本不会发生,它具有独立于执行平台的额外好处:https://snakemake.readthedocs.io/en/stable/snakefiles/rules.html#log-files

在那种情况下,目录当然会由 snakemake 创建,因为它们还不存在。此外,错误消息将直接指向正确的日志文件。