53

假设我有以下简单的 bash 脚本,我想通过 SLURM 提交到批处理服务器:

#!/bin/bash

#SBATCH -o "outFile"$1".txt"
#SBATCH -e "errFile"$1".txt"

hostname

exit 0

在这个脚本中,我只想hostname在一个我通过命令行控制其全名的文本文件上编写输出,如下所示:

login-2:jobs$ sbatch -D `pwd` exampleJob.sh 1
Submitted batch job 203775

不幸的是,我的最后一个命令行参数 (1) 似乎没有通过 sbatch 解析,因为创建的文件没有我要查找的后缀,并且字符串“$1”按字面意思解释:

login-2:jobs$ ls
errFile$1.txt  exampleJob.sh outFile$1.txt

我环顾了SO和其他地方的地方,但我没有任何运气。本质上,我正在寻找的是等效于启用 Torque 的集群-v中的实用程序开关。qsub

编辑:正如在底层评论线程中提到的那样,我以艰难的方式解决了我的问题:我没有将一个脚本多次提交到批处理服务器,每个脚本都有不同的命令行参数,而是创建了一个“主脚本”简单地将相同的内容回显并重定向到不同的脚本,每个脚本的内容由传递的命令行参数更改。然后我通过 . 将所有这些提交到我的批处理服务器sbatch。但是,这并不能回答原始问题,因此我犹豫是否将其添加为我的问题的答案或将此问题标记为已解决。

4

6 回答 6

25

我想我会提供一些见解,因为我也在寻找替代 中的-v选项qsub,这sbatch可以使用该--export选项来完成。我在这里找到了一个不错的网站,它显示了从 Torque 到 Slurm 的转换列表,它使转换更加顺畅。

您可以在 bash 脚本中提前指定环境变量:

$ var_name='1'
$ sbatch -D `pwd` exampleJob.sh --export=var_name

或者直接在sbatch命令中定义它,就像qsub允许的那样:

$ sbatch -D `pwd` exampleJob.sh --export=var_name='1'

这是否适用于#预处理器exampleJob.sh也是另一个问题,但我认为它应该提供与 Torque 中相同的功能。

于 2015-07-24T05:26:16.253 回答
20

使用包装器更方便。我从这个线程中找到了这个解决方案。

基本上问题在于 SBATCH 指令被 shell 视为注释,因此您不能在其中使用传递的参数。相反,您可以在相应地设置参数后使用此处的文档来输入您的 bash 脚本。

如果您有问题,您可以用以下命令替换 shell 脚本文件:

#!/bin/bash
sbatch <<EOT
#!/bin/bash

#SBATCH -o "outFile"$1".txt"
#SBATCH -e "errFile"$1".txt"

hostname

exit 0
EOT

然后像这样运行 shell 脚本:

bash [script_name].sh [suffix]

并且输出将被保存到 outFile[suffix].txt 和 errFile[suffix].txt

于 2017-05-24T21:26:08.887 回答
18

如果您通过命令行传递命令,您实际上可以绕过无法在批处理脚本中传递命令行参数的问题。例如,在命令行:

var1="my_error_file.txt"
var2="my_output_file.txt"
sbatch --error=$var1 --output=$var2 batch_script.sh
于 2016-02-10T12:02:11.523 回答
7

以#SBATCH 开头的行不被 bash 解释,而是被 sbatch 替换为代码。sbatch 选项不支持 $1 变量(仅 %j 和其他一些,将 $1 替换为 %1 将不起作用)。当您没有并行运行不同的 sbatch 进程时,您可以尝试

#!/bin/bash

touch outFile${1}.txt errFile${1}.txt
rm link_out.sbatch link_err.sbatch 2>/dev/null # remove links from previous runs
ln -s outFile${1}.txt link_out.sbatch
ln -s errFile${1}.txt link_err.sbatch

#SBATCH -o link_out.sbatch
#SBATCH -e link_err.sbatch

hostname
# I do not know about the background processing of sbatch, are the jobs still running
# at this point? When they are, you can not delete the temporary symlinks yet.

exit 0

替代方案:正如您自己在评论中所说,您可以制作一个主脚本。该脚本可以包含以下行

cat  exampleJob.sh.template | sed -e 's/File.txt/File'$1'.txt/' > exampleJob.sh
# I do not know, is the following needed with sbatch?
chmod +x exampleJob.sh

在您的模板中,#SBATCH 行看起来像

#SBATCH -o "outFile.txt"
#SBATCH -e "errFile.txt"
于 2014-12-31T10:28:50.997 回答
1

像这样的东西对我和扭矩有用

echo "$(pwd)/slurm.qsub 1" | qsub -S /bin/bash -N Slurm-TEST
slurm.qsub:

#!/bin/bash
hostname > outFile${1}.txt 2>errFile${1}.txt
exit 0
于 2015-08-10T12:09:26.103 回答
0

这是一个老问题,但我只是偶然发现了同样的任务,我认为这个解决方案更简单:

假设我$OUT_PATH在 bash 脚本中有变量launch_analysis.bash,我想将这个变量传递给task_0_generate_features.sl我的 SLURM 文件,以将计算发送到批处理服务器。我会有以下内容launch_analysis.bash

`sbatch --export=OUT_PATH=$OUT_PATH task_0_generate_features.sl`

哪个可以直接访问task_0_generate_features.sl

在@Jason 的情况下,我们将拥有:

sbatch -D `pwd` --export=hostname=$hostname exampleJob.sh

参考:在 SLURM 作业中使用变量

于 2020-05-30T00:48:13.173 回答