通过sbatch传递命令行参数

时间:2014-12-30 16:06:27

标签: bash shell unix slurm

假设我有以下简单的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&#34 ;字面解释:

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

我查看了SOelsewhere中的地方,但我没有运气。基本上我正在寻找的东西相当于启用Torque的集群中-v实用程序的qsub开关。

编辑:正如基础评论主题中所提到的,我解决了我的难题:不是将一个单独的脚本多次提交给批处理服务器,每个脚本都有不同的命令行参数,我创建了一个"主脚本"它简单地回显并将相同的内容重定向到不同的脚本上,每个脚本的内容都被传递的命令行参数改变。然后我通过sbatch将所有这些提交到我的批处理服务器。但是,这不能回答原来的问题,所以我不愿意将其添加为我的问题的答案或标记这个问题已解决。

6 个答案:

答案 0 :(得分:12)

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

var1="my_error_file.txt"
var2="my_output_file.txt"
sbatch --error=$var1 --output=$var2 batch_script.sh

答案 1 :(得分:10)

我认为我会提供一些见解,因为我也在寻找-vqsub选项的替换,sbatch可以使用--export来完成} 选项。我找到了一个nice site here,显示了从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'

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

答案 2 :(得分:2)

以#SBATCH开头的行不是由bash解释的,而是由sbatch替换为代码。 sbatch选项不支持$ 1 vars(只有%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"

答案 3 :(得分:2)

使用包装器更方便。我从this thread找到了这个解决方案。

基本上问题是shell将CBATCH指令视为注释,因此您无法在其中使用传递的参数。相反,您可以在相应地设置参数后使用here文档来提供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

答案 4 :(得分:1)

这样的东西适合我和Torque

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

答案 5 :(得分:0)

这是一个古老的问题,但是我偶然遇到了相同的任务,我认为此解决方案更简单:

假设我在bash脚本$OUT_PATH中有变量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

参考:Using Variables in SLURM Jobs