2

使用一个非常简单的zsh脚本:

#!/bin/zsh

nums=(1 2 3)
num=$nums[$SGE_TASK_ID]

$SGE_TASK_ID是 sun-grid 引擎任务 ID。我正在使用 qsub 提交一系列作业。

我正在遵循 qsub 手册页 ( http://www.clusterresources.com/torquedocs/commands/qsub.shtml#t ) 中的建议,并将我的数组作业提交为

#script name: job_script.sh
qsub job_script.sh -t 1-3

$SGE_TASK_ID 没有为此数组作业设置...有没有人知道为什么?

谢谢!

4

4 回答 4

2

尝试像这样提交作业:

qsub -t 1-3 job_script.sh

看看会发生什么。

观察:

qsub -sync y job_script.sh -t 1-3
Your job 74578 ("job_script.sh") has been submitted
Job 74578 exited with exit code 0.

对比

qsub -sync y -t 1-3 job_script.sh
Your job-array 74579.1-3:1 ("job_script.sh") has been submitted
Job 74579.3 exited with exit code 0.
Job 74579.1 exited with exit code 0.
Job 74579.2 exited with exit code 0.

请注意,扭矩(您问题中引用的手册页)与 SGE 略有不同。我的 SGE 手册页明确建议将所有选项放在命令之前。此外,SGE 不喜欢用“%”语法来限制同时作业的最大数量,但我至少让我说 -tc NNN 来指定限制(手册页中没有提到,但在 qsub -help 中)。

于 2013-05-14T19:11:48.657 回答
1

谢谢大家的回答。我找到了一个可行的解决方案:

根据集群的设置方式,Sun Grid Engine 可能被配置为使用另一个变量名作为阵列 ID。我就是这种情况。我通过执行以下操作找到了要使用的变量:

// job_script.sh

#!/bin/zsh
env >> ~/job_env
set >> ~/job_env

这会将脚本设置的所有环境变量转储到一个名为 job_env 的文件中。只需在文件中查找并查找为每个作业递增的可变数组 ID。应该不是那么难找。

请记住使用 qsub 提交 job_script.sh,如下所示:

qsub -t 1-3 job_script.sh

在我的例子中,设置的 ID 是 $PBS_ARRAYID。我不认为这是默认设置,因此 $SGE_TASK_ID 应该适用于集群上的标准 SGE 设置。

干杯!

于 2013-05-14T21:45:52.943 回答
1

要访问数组中的位置,您必须这样做${the_array[$the_position]}

所以在你的情况下,

num=${nums[$SGE_TASK_ID]}

测试:

$ nums=(1 2 3)
$ SGE_TASK_ID=1
$ echo ${nums[$SGE_TASK_ID]}
2

请注意,第一个位置是第 0 个。

于 2013-05-10T14:01:50.760 回答
1

您需要用花括号将数组变量括起来:

SGE_TASK_ID=2
nums=(1 2 3)
num=${nums[$SGE_TASK_ID]}
echo "num: $num"
# prints "num: 3"

Linux 文档项目拥有最好的 shell 脚本文档

于 2013-05-10T14:01:59.413 回答