我在通过--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的解决方案。