假设我有以下简单的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)似乎没有通过S批处理进行解析,因为创建的文件没有我要查找的后缀,字符串"$1“是按字面解释的:
login-2:jobs$ ls
errFile$1.txt exampleJob.sh outFile$1.txt我环顾过所以和其他地方的地方,但我没有任何运气。本质上,我正在寻找的是相当于-v开关的qsub实用工具在扭矩启用集群。
编辑:正如底层评论线程中提到的那样,我以困难的方式解决了我的问题:我创建了一个“主脚本”,它简单地将相同的内容回显并重定向到不同的脚本中,每个脚本的内容都被传递的命令行参数更改,而不是将一个脚本多次提交给批处理服务器,每个脚本都有不同的命令行参数。然后,我通过sbatch将所有这些都提交给了我的批处理服务器。然而,这并没有回答原来的问题,所以我不愿意把它作为我的问题的答案或标记这个问题解决了。
发布于 2014-12-31 10:28:50
以#SBATCH开头的行不是由bash解释的,而是由S批处理替换为代码。S批处理选项不支持$1 vars (只支持%j和其他一些选项,用%1替换$1将不起作用)。当没有不同的批处理进程并行运行时,可以尝试
#!/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"发布于 2017-05-24 21:26:08
使用包装器更方便。我从这条线找到了这个解决方案。
基本上,问题是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]并将输出保存到outFilesuffix.txt和errFilesuffix.txt中。
发布于 2016-02-10 12:02:11
如果通过命令行传递命令,实际上可以绕过不能在批处理脚本中传递命令行参数的问题。例如,在命令行:
var1="my_error_file.txt"
var2="my_output_file.txt"
sbatch --error=$var1 --output=$var2 batch_script.shhttps://stackoverflow.com/questions/27708656
复制相似问题