如何在 .out 文件中输出 SBATCH 选项或如何在 bash 中回显注释行

问题描述 投票:0回答:1

我对使用 SLURM 工作负载管理器进行 HPC 计算相当陌生,因此尚未找到可靠的工作例程。截至目前,我有一个带有一堆 #SBATCH 标志的作业脚本,每当我进行另一次计算时我都会修改这些标志。 这包括总运行时间和节点/任务/CPU 的数量。

由于我仍在积累经验,我想将所选选项保存在 SLURM 生成的标准 .out 文件中以供参考。我在 sbatch 手册页 文件名模式部分找到了一些选项,至少可以记住作业名称,但我真正想要的是所有设置的 #SBATCH 标志的完整列表。

我目前的解决方法是这样的

#!/bin/bash
#SBATCH --ntasks=2
#SBATCH --cpus-per-task=4
#SBATCH --time=0:20:00
#SBATCH --mem=4G
#SBATCH -p normal
#SBATCH -q cont
#SBATCH -J crosscorr
#SBATCH --output=jobscript_slurmout/R-%j.%x.out

echo "#SBATCH --ntasks=2
#SBATCH --cpus-per-task=4
#SBATCH --time=0:20:00
#SBATCH --mem=4G
#SBATCH -p normal
#SBATCH -q cont
#SBATCH -J crosscorr
#SBATCH --output=jobscript_slurmout/R-%j.%x.out
"

并且显然不令人满意并且还容易出现错别字。由于 SLURM 管理器依赖于 bash 看不到的代码(因为它已被注释掉),因此我认为使用 bash 语言无法轻松解决此问题。我也没有找到任何使用 sbatch 选项的提示。

也许还有另一种方法来保存这些选项。我知道我可能会使用自动 seff 查询来 grep 这些所需的选项,但我希望有一种更简单的方法,因为作业 ID 仅在作业提交后分配。

bash slurm hpc sbatch
1个回答
0
投票

我不知道

slurm
是什么,但您似乎正在使用构造
#SBATCH
bash
脚本中为其设置一些选项,所以您不能这样做吗:

$ cat tst.sh
#!/usr/bin/env bash

declare -a sbatch
sbatch+=( '--ntasks=2' )
sbatch+=( '--cpus-per-task=4' )
sbatch+=( '--time=0:20:00' )
sbatch+=( '--mem=4G' )
sbatch+=( '-p normal' )
sbatch+=( '-q cont' )
sbatch+=( '-J crosscorr' )
sbatch+=( '--output=jobscript_slurmout/R-%j.%x.out' )

for opt in "${sbatch[@]}"; do
    printf '#SBATCH %s\n' "$opt"
    #SBATCH "$opt"
done

$ ./tst.sh
#SBATCH --ntasks=2
#SBATCH --cpus-per-task=4
#SBATCH --time=0:20:00
#SBATCH --mem=4G
#SBATCH -p normal
#SBATCH -q cont
#SBATCH -J crosscorr
#SBATCH --output=jobscript_slurmout/R-%j.%x.out

您可以使用它来替换当前脚本以设置

#SBATCH
(如果有效)或生成另一个脚本来替换当前脚本:

$ cat ./tst.sh
#!/usr/bin/env bash

declare -a sbatch
sbatch+=( '--ntasks=2' )
sbatch+=( '--cpus-per-task=4' )
sbatch+=( '--time=0:20:00' )
sbatch+=( '--mem=4G' )
sbatch+=( '-p normal' )
sbatch+=( '-q cont' )
sbatch+=( '-J crosscorr' )
sbatch+=( '--output=jobscript_slurmout/R-%j.%x.out' )

printf '#!/usr/bin/env bash\n\n'
for opt in "${sbatch[@]}"; do
    printf '#SBATCH %s\n' "$opt"
done | tee '/dev/stderr'

$ cat slurm.sh
cat: slurm.sh: No such file or directory

$ ./tst.sh > slurm.sh
#SBATCH --ntasks=2
#SBATCH --cpus-per-task=4
#SBATCH --time=0:20:00
#SBATCH --mem=4G
#SBATCH -p normal
#SBATCH -q cont
#SBATCH -J crosscorr
#SBATCH --output=jobscript_slurmout/R-%j.%x.out

$ cat slurm.sh
#!/usr/bin/env bash

#SBATCH --ntasks=2
#SBATCH --cpus-per-task=4
#SBATCH --time=0:20:00
#SBATCH --mem=4G
#SBATCH -p normal
#SBATCH -q cont
#SBATCH -J crosscorr
#SBATCH --output=jobscript_slurmout/R-%j.%x.out
© www.soinside.com 2019 - 2024. All rights reserved.