【问题标题】:pass variable script argument to another script then qsub to program将变量脚本参数传递给另一个脚本,然后将 qsub 传递给程序
【发布时间】:2013-08-27 20:26:27
【问题描述】:

阅读大量 bash 脚本线程和帮助站点后,我找不到可行的解决方案。

我想将变量参数“i”从一个脚本传递给另一个脚本 $i,然后将其 qsub 传递给一个程序“$1”。在程序中,我从参数向量 (**argv) 中读取变量,然后使用该变量将输出文件的名称修改为 *_0、*_1、*_2、...、*_n。

我的想法是,我可以为每个程序实例创建一个唯一的输出文件。该程序是并行的,但由于计算资源的限制,我需要为最多四个计算节点提交一个作业 - 否则它永远不会通过队列。所以,我想分拆 64 个 4 节点作业。

到目前为止,我已经阅读了以下主题:

阅读这些后,我对这个概念感到满意,但仍然令人困惑 -C 和 -S 命令究竟是如何使用的,或者它们是否被使用过;大多数示例不包括这些。

这是我的衍生脚本

#
#$ -cwd
#$ -S /bin/bash
#$ -pe fah 1
for((i=0; i < 2; i++)); do qsub test_S17_script.sh $i; done

侧面信息:what is qsub

这是我的脚本

#
#$ -M duser@acme_u.edu
#$ -m bae
#$ -cwd
#$ -S /bin/bash
#$ -pe fah 1

./daedalus_linux_1.3_64 1 "$1"

因此,衍生作品运行良好,并生成了文件。而且,脚本可以很好地传递常量./daedalus_linux_1.3_64 1 1,但传递变量不起作用。我不知道处方是否正确地将变量 i 传递给脚本。我不知道如何从脚本写入错误文件 - 或者如果这就是我想要检查变量是否通过的方式。计算没有用户界面,所以一旦它在队列中,我必须依赖错误文件输出。

提前感谢您的帮助。

【问题讨论】:

  • 什么是qsub?可能有助于诊断此问题的一件事是使用 set -x 并捕获标准错误输出。
  • 您也可以尝试echo $@ 确认参数是否通过。
  • @Samveen 将 echo $@ 在没有接口的情况下工作 - 脚本被提交到批处理队列所以什么都没有?

标签: linux shell argv hpc qsub


【解决方案1】:

考虑使用PBS Job Arrays。单个 pbs 脚本将提交多个作业,每个作业的环境变量 $PBS_ARRAY_INDEX 都有不同的值。

【讨论】:

    【解决方案2】:

    如果您希望将标准输出从您的规范传递到脚本, 你可以这样做:

    ./daedalus_linux_1.3_64 1 `<prescript>`
    

    如果 prescript 在单独的行上打印来自 for 循环 (i=0, i=1) 的每次迭代的输出,您可能可以将 prescript 生成的输出通过管道传输到 xargs 命令。

    在规定中,您可以更改输出格式以在一行中显示由 qsub 的每次迭代生成的所有输出,如下所示:

    for((i=0; i < 2; i++)); do qsub test_S17_script.sh $i; done | xargs
    

    或者您可以按如下方式使用 xargs:

    ./daedalus_linux_1.3_64 1 `<prescript> | xargs`
    

    希望对您有所帮助。

    【讨论】:

    • 我不知道这是否有帮助 - 这肯定不是我希望解决方案采用的格式
    • 在解决这个问题后,我找到了一个使用数组的解决方案 - 似乎 for 循环可以工作,但正如您在解决方案中显示的那样,它对用户不友好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    相关资源
    最近更新 更多