0

我在使用带有 SLURMsbatch提交的(Bash)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 <<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

可能有人知道我怎样才能让它工作吗?

4

3 回答 3

1

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

使用 heredoc cat,它确实需要一个文件名,并将其输出用作--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)
于 2018-10-30T21:09:26.787 回答
1

您可以只使用heredoc,而无需在其顶部wrap添加。#!/bin/bash

于 2018-10-30T22:47:26.290 回答
0

改编一篇关于将 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 的解决方案。

于 2018-10-30T19:55:30.593 回答