【问题标题】:Use of a HEREDOC with SLURM sbatch --wrap将 HEREDOC 与 SLURM sbatch --wrap 一起使用
【发布时间】:2019-04-03 22:19:41
【问题描述】:

我在使用带有 SLURM sbatch 提交的(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

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

【问题讨论】:

    标签: bash heredoc slurm sbatch


    【解决方案1】:

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

    【讨论】:

    • 我希望可以。一直没找到,如果有请告诉我。请参阅 herehere&lt;&lt;&lt; 是这里的字符串,它们具有类似的功能,但没有分隔符。
    【解决方案2】:

    只要在其顶部添加#!/bin/bash,您就可以使用不带wrap 的heredoc。

    【讨论】:

      【解决方案3】:

      在将 HEREDOC 分配给变量时调整related post,而是使用cat(因为我使用errexit 并想避免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 的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-21
        • 2016-05-18
        • 2017-10-01
        • 1970-01-01
        • 2021-08-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多