Использование HEREDOC с SLURM sbatch --wrap - PullRequest
0 голосов
/ 30 октября 2018

Я сталкиваюсь с трудностями при использовании (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 возвращает приведенную ниже ошибку, отказываясь отправить эту работу:

ERROR:   option --wrap requires argument

Может кто-нибудь знает, как я могу заставить это работать?

Ответы [ 3 ]

0 голосов
/ 31 октября 2018

Поскольку 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)
0 голосов
/ 31 октября 2018

Вы можете просто использовать heredoc без wrap при условии, что вы добавите #!/bin/bash вверху.

0 голосов
/ 30 октября 2018

Адаптация связанного с сообщения о присвоении 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...