将 HEREDOC 与 SLURM sbatch --wrap 结合使用

Use of a HEREDOC with SLURM sbatch --wrap

我在使用 (Bash) HEREDOC 和 SLURM sbatch 提交时遇到困难,来自 --wrap

我希望以下操作有效:

SBATCH_PARAMS=('--nodes=1' '--time=24:00:00' '--mem=64000' '--mail-type=ALL')

sbatch ${SBATCH_PARAMS[@]} --job-name="MWE" -o "MWE.log" --wrap <<EOF
        SLURM_CPUS_ON_NODE=${SLURM_CPUS_ON_NODE:-8}
        SLURM_CPUS_PER_TASK=${SLURM_CPUS_PER_TASK:-$SLURM_CPUS_ON_NODE}
        export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK

        parallel --joblog "MWE-jobs.log" --resume --resume-failed -k --linebuffer -j $(($OMP_NUM_THREADS/4)) --link "MWE.sh {1} {2}" ::: "./"*R1*.fastq.gz ::: "./"*R2*.fastq.gz
EOF

在我当前的集群上,sbatch returns 出现以下错误,拒绝提交此作业:

ERROR:   option --wrap requires argument

可能有人知道我如何让它工作吗?

调整 related post on assigning a HEREDOC to a variable, but instead using cat (since I use errexit and want to avoid working-around the non-zero exit value of the read),我能够按如下方式提交我的工作:

CMD_FOR_SUB=$(cat <<EOF
    SLURM_CPUS_ON_NODE=${SLURM_CPUS_ON_NODE:-8}
    SLURM_CPUS_PER_TASK=${SLURM_CPUS_PER_TASK:-$SLURM_CPUS_ON_NODE}
    export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK

    parallel --joblog "MWE-jobs.log" --resume --resume-failed -k --linebuffer -j $(($OMP_NUM_THREADS/4)) --link "MWE.sh {1} {2}" ::: "./"*R1*.fastq.gz ::: "./"*R2*.fastq.gz
EOF
)

sbatch ${SBATCH_PARAMS[@]} --job-name="MWE" -o "MWE.log" --wrap "$CMD_FOR_SUB"

虽然这似乎可行,但我仍然更喜欢允许 sbatch 直接接受 HEREDOC 的解决方案。

因为wrap需要一个字符串参数,你不能直接使用heredoc。 Heredocs 用于在不希望创建文件名的情况下使用文件名。

cat 使用 heredoc,它确实需要一个文件名,并将其输出用作 --wrap 需要的字符串:

SBATCH_PARAMS=('--nodes=1' '--time=24:00:00' '--mem=64000' '--mail-type=ALL')

sbatch ${SBATCH_PARAMS[@]} --job-name="MWE" -o "MWE.log" --wrap $(cat << EOF
        SLURM_CPUS_ON_NODE=${SLURM_CPUS_ON_NODE:-8}
        SLURM_CPUS_PER_TASK=${SLURM_CPUS_PER_TASK:-$SLURM_CPUS_ON_NODE}
        export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK

        parallel --joblog "MWE-jobs.log" --resume --resume-failed -k --linebuffer -j $(($OMP_NUM_THREADS/4)) --link "MWE.sh {1} {2}" ::: "./"*R1*.fastq.gz ::: "./"*R2*.fastq.gz
EOF)

你可以只使用没有 wrap 的 heredoc,前提是你在它的顶部添加 #!/bin/bash