将 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
。
我在使用 (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
。