如何参数化在网格上执行的 shell 脚本(以 qsub 开头)?我有一个 shell 脚本,我使用 getopts 来读取参数。
当我使用 qsub 启动 (qsub script.sh -r firstparam -s secondparam ..) 这个工作脚本时,我收到错误消息,
qsub: 无效选项 -- s
qsub: 非法 -r 值
因为 qsub 认为参数是为自己的。然而我还没有找到任何解决方案。
谢谢
如何参数化在网格上执行的 shell 脚本(以 qsub 开头)?我有一个 shell 脚本,我使用 getopts 来读取参数。
当我使用 qsub 启动 (qsub script.sh -r firstparam -s secondparam ..) 这个工作脚本时,我收到错误消息,
qsub: 无效选项 -- s
qsub: 非法 -r 值
因为 qsub 认为参数是为自己的。然而我还没有找到任何解决方案。
谢谢
使用 qsub -v 选项是正确的方法:
qsub -v par_name=par_value[,par_name=par_value...] script.sh
par_name 可以用作 shell 脚本中的变量。
除了 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
希望这可以帮助!
我只是想出了如何解决它:只需使用 echo 打印 shell 脚本的命令并将结果通过管道传输到 qsub:
echo "./script.sh var1=13 var2=24" | qsub
我真的很惊讶这个问题有多久没有一个好的答案。可能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
.