2013-05-10 29 views
2

一個非常簡單的腳本zsh

#!/bin/zsh 

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

$SGE_TASK_ID是太陽網格引擎任務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沒有被設置爲這個陣列的工作......沒有任何人有任何想法,爲什麼?

謝謝!

+0

你確定你使用'bash'嗎?我無法在'bash'中觸發該錯誤,我認爲Sun使用不同的shell作爲它的'/ bin/sh'。無論如何,給出的答案應該可行。 – chepner 2013-05-10 14:17:50

+0

哎呦,對不起,我在zsh上。我不認爲這很重要,因爲我確信我可以在bash環境中執行相同的命令,這是默認的環境設置。 – sidmontu 2013-05-10 17:03:28

+0

我的個人意見:繼續編輯此問題,替換舊問題。目前的答案都沒有涉及到爲什麼'SGE_TASK_ID'沒有設置的真正問題。 – chepner 2013-05-10 17:15:08

回答

1

謝謝大家的答案。我發現,有效的解決方案:

根據羣集的設置方式,在Sun Grid Engine的可能被配置爲使用另一個變量名數組ids。這對我來說是如此。我發現變量通過執行以下操作使用方法:

// 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設置。

乾杯!

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個。

1

您需要環繞數組變量用花括號:

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

Linux文檔項目有best shell scripting docs

+0

謝謝!我嘗試了所有這些,但沒有奏效。我意識到我在識別錯誤​​時犯了一個錯誤,並且更新了我遇到的問題。 – sidmontu 2013-05-10 17:04:32

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中)。