48

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

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

qsub: 无效选项 -- s

qsub: 非法 -r 值

因为 qsub 认为参数是为自己的。然而我还没有找到任何解决方案。

谢谢

4

4 回答 4

45

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

qsub -v par_name=par_value[,par_name=par_value...] script.sh

par_name 可以用作 shell 脚本中的变量。

于 2011-01-19T10:07:38.510 回答
36

除了 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}"

输出将在哪里

qux

希望这可以帮助!

于 2013-06-12T15:05:15.827 回答
22

我只是想出了如何解决它:只需使用 echo 打印 shell 脚本的命令并将结果通过管道传输到 qsub:

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

于 2010-09-01T13:25:17.470 回答
20

有一个更好的方法...

我真的很惊讶这个问题有多久没有一个好的答案。可能qsub是没有指定具体版本。qsub至少存在于 Torque 和 Sun Grid Engine 中,也许还有其他调度程序。所以,重要的是要知道你正在使用哪个。我在这里谈几个:

扭矩:qsub -F <arguments> command

手册页
这是我通常如何使用它的示例。从这个示例脚本开始,它只是回显传递给它的任何参数:

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

echo $@

我会这样提交工作:

$ qsub -F "--here are the --args" testArgs.pbs
3883919.pnap-mgt1.cm.cluster

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

$ cat testArgs.pbs.o3883919
--here are the --args

太阳网格引擎:qsub command [ command_args ]

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

浆糊:sbatch command [ command_args ]

手册页
在这里,我提交了与上面 Torque 示例一起使用的相同脚本:

$ sbatch testArgs.sh what the heck
Submitted batch job 104331

结果:

$ cat slurm-104331.out
what the heck

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

导出环境变量与将参数传递给命令非常不同。
这是关于差异的很好的讨论。

以上qsub所有答案都推荐-v。需要明确的是,-v导出环境变量,-F将参数传递给命令。

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

于 2017-09-20T18:06:18.827 回答