将HEREDOC与SLURM sbatch--wrap一起使用



我在通过--wrap提交SLURMsbatch时遇到了使用(Bash(HEREDOC的困难。

我希望以下工作:

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返回以下错误,拒绝提交此作业:

ERROR:   option --wrap requires argument

有人知道我该怎么做吗?

由于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)

您可以只使用heredoc而不使用wrap,前提是在其顶部添加#!/bin/bash

修改了一篇关于将HEREDOC分配给变量的相关文章,但使用了cat(因为我使用errexit,并且希望避免处理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的解决方案。

最新更新