5

我正在整理一个snakemake slurm 工作流程,并且在我的工作目录变得混乱的slurm 输出文件时遇到了麻烦。我希望我的工作流程至少将这些文件定向到我工作目录中的“slurm”目录。我目前的工作流程设置如下:

配置.yaml:

reads:
    1:
    2:
samples:
    15FL1-2: /datasets/work/AF_CROWN_RUST_WORK/2020-02-28_GWAS/data/15FL1-2
    15Fl1-4: /datasets/work/AF_CROWN_RUST_WORK/2020-02-28_GWAS/data/15Fl1-4

集群.yaml:

localrules: all

__default__:
    time: 0:5:0
    mem: 1G
    output: _{rule}_{wildcards.sample}_%A.slurm

fastqc_raw:
    job_name: sm_fastqc_raw
    time: 0:10:0
    mem: 1G
    output: slurm/_{rule}_{wildcards.sample}_{wildcards.read}_%A.slurm

蛇文件:

configfile: "config.yaml"
workdir: config["work"]

rule all:
    input:
        expand("analysis/fastqc_raw/{sample}_R{read}_fastqc.html", sample=config["samples"],read=config["reads"])

rule clean:
    shell:
        "rm -rf analysis logs"

rule fastqc_raw:
    input:
        'data/{sample}_R{read}.fastq.gz'
    output:
        'analysis/fastqc_raw/{sample}_R{read}_fastqc.html'
    log:
        err = 'logs/fastqc_raw/{sample}_R{read}.out',
        out = 'logs/fastqc_raw/{sample}_R{read}.err'
    shell:
        """
        fastqc {input} --noextract --outdir 'analysis/fastqc_raw' 2> {log.err} > {log.out}
        """

然后我打电话给:

snakemake --jobs 4  --cluster-config cluster.yaml --cluster "sbatch --mem={cluster.mem} --time={cluster.time} --job-name={cluster.job_name} --output={cluster.output}"

这不起作用,因为该slurm目录尚不存在。我不想在运行我的 snakemake 命令之前手动进行此操作,这对可扩展性不起作用。在阅读了所有相关问题后,我尝试过的事情是:

1)只需尝试通过规则内的日志捕获所有输出,然后设置cluster.output='/dev/null'. 不起作用,未捕获 slurm 输出中的信息,因为它不完全是规则的输出,它的工作信息

2)通过添加虚拟日志来强制创建目录:

    log:
        err = 'logs/fastqc_raw/{sample}_R{read}.out',
        out = 'logs/fastqc_raw/{sample}_R{read}.err'
        jobOut = 'slurm/out.err'

我认为这不起作用,因为 sbatch 在实施规则之前尝试找到 slurm 文件夹

3) 允许在工作目录中制作文件,并在规则末尾添加 bash 代码以将文件移动到 slurm 目录中。我相信这不起作用,因为它会在作业完成写入 slurm 输出之前尝试移动文件。

任何进一步的想法或技巧?

4

2 回答 2

1

您应该能够通过调用来抑制这些sbatch输出--output=/dev/null --error=/dev/null。像这样的东西:

snakemake ... --cluster "sbatch --output=/dev/null --error=/dev/null ..."

如果您希望文件转到您选择的目录,您当然可以更改调用以反映:

snakemake ... --cluster "sbatch --output=/home/Ensa/slurmout/%j.out --error=/home/Ensa/slurmout/%j.out ..."
于 2020-05-18T11:20:33.050 回答
0

所以这就是我解决问题的方法(可能有更好的方法,如果是这样,我希望有人能纠正我)。就我个人而言,我会竭尽全力避免对任何东西进行硬编码。我使用snakemake 配置文件和sbatch 脚本。

首先,我制作了一个包含如下行的蛇形配置文件:

cluster: "sbatch --output=slurm_out/slurm-%j.out --mem={resources.mem_mb} -c {resources.cpus} -J {rule}_{wildcards} --mail-type=FAIL --mail-user=me@me.edu"

您可以看到 --output 参数将 slurm 输出文件重定向到当前工作目录中名为 slurm_out 的子目录。但是 AFAIK,如果 slurm 不存在,则无法创建该目录。所以...

接下来我制作了一个小 sbatch 脚本,它唯一的工作就是创建子目录,然后调用 sbatch 脚本来提交工作流。这个“包装器”看起来像:

#!/bin/bash

mkdir -p ./slurm_out
sbatch snake_submit.sbatch

最后,snake_submit.sbatch 看起来像:

#!/bin/bash

ml snakemake

snakemake --profile <myprofile>

在这种情况下,它调用的 wrapper 和 sbatch 脚本都将在当前工作目录中拥有它们的 slurm out 文件。我更喜欢这种方式,因为我更容易找到它们。但是我认为您可以通过向snake_submit.sbatch 脚本添加另一个#SBATCH --output 参数来轻松地重新定向(但不是包装器,那么它一直是海龟,你知道吗?)。

我希望这是有道理的。

于 2021-06-29T15:20:35.213 回答