如何参数化在网格上执行的shell脚本(从QSUB启动)?我有一个shell脚本,我在其中使用getopts读取参数。

当我启动时(qsub脚本。

QSUB:无效选项 - S

QSUB:非法-r值

正如Qsub认为,参数本身是本身。但是我还没有找到任何解决方案。

谢谢

有帮助吗?

解决方案 3

我只是想出了如何解决它:只需用回声打印外壳脚本的命令,然后将结果管道到qsub:

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

其他提示

使用QSUB -V选项是正确的方法:

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

PAR_NAME可以用作Shell脚本中的变量。

除了沃尔克的答案外,要引用列表中的变量(由-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

希望这可以帮助!

有一个更好的方法...

我真的很惊讶这个问题没有一个好的答案。可能是特定版本的 qsub 未指定。 qsub 至少存在扭矩和太阳电网引擎,也许还有其他调度器。因此,重要的是要知道您正在使用哪个。我在这里谈论一些:

扭矩: 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 ]

男人页
您只需在命令之后添加参数,就像在外壳中执行时一样。我在任何地方都没有SGE运行,因此没有示例。但是Slurm也是如此,下面是

Slurm: sbatch command [ command_args ]

男人页
在这里,我提交了与上面的扭矩示例一起使用的相同脚本:

$ 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.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top