【问题标题】:parameter for shell scripts that is started with qsub以 qsub 开头的 shell 脚本的参数
【发布时间】:2011-03-31 01:33:41
【问题描述】:

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

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

qsub: 无效选项 -- s

qsub: 非法 -r 值

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

谢谢

【问题讨论】:

  • 我刚刚想出了如何解决它:只需使用 echo 打印 shell 脚本的命令并将结果通过管道传输到 qsub: ./script.sh | qsub
  • 您应该发布您的解决方案作为答案。然后回来并标记它已接受。顺便说一句,您是否尝试将参数引用到qsubqsub 'script.sh -r firstparam -s secondparam'我不知道这在这种情况下是否有效。
  • 我见过不止一个名为qsub的命令;你指的是this one吗?

标签: linux shell grid-computing qsub


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的建议!在我看来,这种方法的问题在于将一个应用程序用作独立或分布式应用程序的参数处理的差异。所以我更喜欢上面描述的风格。
  • 如果我不关心变量的名称怎么办(因为在我的脚本中我只使用了 $1、$2 等等)?更准确地说,我想要的只是将参数传递给脚本。
  • 我也不关心变量的名称——我更喜欢脚本来解析选项,就像直接从终端运行时一样,即使使用 qsub 运行也是如此。
【解决方案2】:

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

希望这会有所帮助!

【讨论】:

  • @_jhrf 我想你想要$bar
  • 你是对的。我已经多次查看此答案,但没有看到该错误!谢谢。
  • @Manolete 和@jhrf 因为你特地给了bash,在这种情况下没关系。虽然 ` = ` (带空格 is 是一个语法问题......)。请参阅 this excellent answer 了解为什么 $bar${bar} 都在这里工作:)
【解决方案3】:

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

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

【讨论】:

  • 你的答案需要更明确——举个例子
  • 看来我的problem,是类似的。我需要如何更改我的 bash 脚本?你能举个例子吗?
  • 这个答案中的问题是作业名称始终是 STDIN(如 qstat -a 中所示),至少对我而言
  • @hammady 只需使用echo "./script.sh var1=13 var2=24" | qsub -N myjobname
  • 恐怕这只是在执行qsub的节点上运行script.sh,而不是在集群上。
【解决方案4】:

有更好的方法...

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

扭矩:qsub -F <arguments> command

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

$ 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

Sun Grid Engine:qsub command [ command_args ]

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

Slurm:sbatch command [ command_args ]

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

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

结果:

$ cat slurm-104331.out
what the heck

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

导出环境变量与将参数传递给命令有很大不同。
Here is a good discussion on the differences.

qsub 的回答首先推荐-v。需要明确的是,-v 导出环境变量,-F 将参数传递给命令。

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

【讨论】:

  • 谢谢!在我的环境中, man qsub 说没有 -F 选项,但我还是尝试了它并且它有效!可能最近添加了此选项。但这是这个问题的正确答案。
  • 谢谢!我正在使用 qsub(Sun Grid Engine),它可以工作!请注意,您不需要添加“命令”作为关键字。 qsub script.sge arguments
猜你喜欢
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 2018-11-18
  • 2020-11-27
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
相关资源
最近更新 更多