用qsub启动的shell脚本的参数

Mar*_*tin 42 linux shell grid-computing qsub

如何参数化在网格上执行的shell脚本(以qsub开头)?我有一个shell脚本,我使用getopts来读取参数.

当我启动(qsub script.sh -r firstparam -s secondparam ..)这个带有qsub的工作脚本时,我收到错误消息,

qsub:无效选项 - s

qsub:非法-r值

正如qsub认为参数是为自己的.但我还没有找到任何解决方案.

谢谢

小智 44

使用qsub -v选项是正确的方法:

qsub -v par_name=par_value[,par_name=par_value...] script.sh
Run Code Online (Sandbox Code Playgroud)

par_name可以在shell脚本中用作变量.

  • 如果我不关心变量的名称怎么办(因为在我的脚本中我只使用$ 1,$ 2等)?更确切地说,我想要的只是将参数传递给脚本. (13认同)
  • 我也不关心变量的名称 - 我更喜欢脚本解析选项,就像直接从终端运行时一样,即使使用qsub运行也是如此. (3认同)

jhr*_*hrf 35

除了volk的答案,为了引用列表中的变量(由-v指定),您只需使用您在调用中定义的名称.所以,比如说你打电话给qsub如下

qsub -v foo='qux' myRunScript.sh

然后myRunScript.sh看起来像这样:

#!/bin/bash
#PBS -l nodes=1:ppn=16,walltime=0:00:59
#PBS -l mem=62000mb
#PBS -m abe

bar=${foo}
echo "${bar}"
Run Code Online (Sandbox Code Playgroud)

输出的地方

qux
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

  • @Manolete和@jhrf,因为你特意给了'bash`,在这种情况下没关系.虽然`=`(空格**是**语法问题......).请参阅[这个优秀的答案](/sf/answers/1269584431/),了解为什么`$ bar`和`$ {bar}`都在这里工作:) (3认同)

Mar*_*tin 20

我只是弄清楚如何解决它:只需使用echo打印shell脚本的命令并将结果传递给qsub:

echo "./script.sh var1=13 var2=24" | qsub


cal*_*co_ 12

有一个更好的方法...

如果没有一个好的答案,这个问题已经持续多久,我真的很惊讶.可能qsub是未指定特定版本.qsub至少存在于Torque和Sun Grid Engine中,可能还有其他调度程序.因此,了解您正在使用的内容非常重要.我在这里谈谈几个:

TORQUE: qsub -F <arguments> command

man page
这是我通常如何使用它的一个例子.从这个示例脚本开始,它只是回显传递给它的任何参数:

$ cat testArgs.pbs
#!/usr/bin/env bash

echo $@
Run Code Online (Sandbox Code Playgroud)

我会提交这样的工作:

$ qsub -F "--here are the --args" testArgs.pbs
3883919.pnap-mgt1.cm.cluster
Run Code Online (Sandbox Code Playgroud)

这就是输出文件运行后的样子:

$ cat testArgs.pbs.o3883919
--here are the --args
Run Code Online (Sandbox Code Playgroud)

Sun Grid Engine: qsub command [ command_args ]

手册页
您只需在命令后添加参数,就像在shell中执行时一样.我没有在任何地方运行SGE,所以没有这个例子.但它与下面的Slurm相同

SLURM: sbatch command [ command_args ]

man page
在这里,我提交了与上面Torque示例中使用的相同的脚本:

$ sbatch testArgs.sh what the heck
Submitted batch job 104331
Run Code Online (Sandbox Code Playgroud)

结果如下:

$ cat slurm-104331.out
what the heck
Run Code Online (Sandbox Code Playgroud)

导出环境变量!=传递参数

导出环境变量与将参数传递给命令有很大不同.
以下是对差异的良好讨论.

以上qsub答案都是推荐的-v.要清楚,-v导出环境变量,-F将参数传递给命令.

我通常更喜欢通过允许参数来参数化我的脚本.事实上,我会说使用这样的脚本process_data.sh --threads 8比做类似的事情更常见export THREADS=8; process_data.sh.