假设我有以下简单的bash脚本,我想通过SLURM提交给批处理服务器:
#!/bin/bash #SBATCH -o "outFile"$1".txt" #SBATCH -e "errFile"$1".txt" hostname exit 0
在这个脚本中,我只想把主机名的输出写在我通过命令行控制的全名的文本文件中,如下所示:
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和elsewhere看过周围的地方,但我没有任何运气.本质上我正在寻找的是相当于启用了Torque的群集中qsub实用程序的-v开关.
编辑:正如基础注释线程中所提到的,我解决了我的问题困难的方式:而不是有一个单一的脚本将被提交到批处理服务器,每个具有不同的命令行参数,我创建了一个“主脚本”,简单地将相同的内容回传并重定向到不同的脚本,每个的内容都被传递的命令行参数改变.然后我通过sbatch将所有这些提交给我的批处理服务器.但是,这并没有回答原来的问题,所以我犹豫,把它添加为我的问题的答案或者标记这个问题解决了.
以#SBATCH开头的行不会被bash解释,而是用sbatch代码替换.
sbatch选项不支持$1 vars(只有%j和其他一些,%1替换$1将不起作用).
当您没有并行运行不同的sbatch进程时,可以尝试一下
原文链接:https://www.f2er.com/bash/383780.htmlsbatch选项不支持$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"