2016-06-09 40 views
2

我正在編寫腳本以通過sge集羣中的qsub運行。sge在腳本中獲取腳本位置

我有幾個可執行文件,我需要在腳本中調用和所有的人都在同一個位置(與腳本本身)。所以我想知道如何獲得腳本Im執行的位置。 我有一個自動構建系統,它只是不正確的代碼這個位置。代碼應該是類似的東西

#!/bin/bash 
#$ -S /bin/bash 
#$ -V 
#$ -cwd 
#$ -N "Job" 

exec="/path/to/this/script/"execNameJob 
$exec 

我嘗試了一些事情,他們沒有工作,人們標記爲重複。以前的解決方案都沒有工作。我使用 qsub -o console.out /tmp/qsubScript/qsubScript.sh運行我的腳本。我想是的/ tmp/qsubScript /腳本路徑

SOURCE="${BASH_SOURCE[0]}" 
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink 
    DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)" 
    SOURCE="$(readlink "$SOURCE")" 
    [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located 
done 
DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)" 

echo " Directory SOURCE: $DIR" 
echo " BaseDir 0: " $0 
echo " SGE_ROOT: $SGE_ROOT" 
echo " SGE_JOB_SPOOL_DIR: $SGE_JOB_SPOOL_DIR" 

輸出爲:

目錄源中:/ opt/gridengine /默認/卷軸/計算-2-8/job_scripts
的BaseDir 0:/選擇/ gridengine /默認/閥芯/計算-2-8/job_scripts/9534
SGE_ROOT中:/ opt/gridengine
SGE_JOB_SPOOL_DIR中:/ opt/gridengine /默認/閥芯/計算-2-8/active_jobs/9534.1

的主要問題是,SGE我mplementation將我的腳本複製到job_script中,所以我放棄了對原始腳本的引用。

+4

這是什麼? [Bash腳本可以告訴它存儲在哪個目錄?](http://stackoverflow.com/q/59895/1983854) – fedorqui

+0

我之前試過,看起來SGE正在通過另一個腳本執行我的腳本。假設我在/ tmp/qsubDir /運行此解決方案時找到了我的腳本:目錄SOURCE:/ opt/gridengine/default/spool/compute-3-15/job_scripts – leo

+0

我添加了這個作爲示例, – leo

回答

0

我的猜測是,qsub商店提交一個單獨的目錄,然後運行它從那裏。到那時,原始隊列條目的路徑將會丟失。如果需要將其作爲參數包含在作業的元數據中,您只需將其作爲參數傳遞即可。

提交目錄一般是不能保證是可見的,其運行工作,所以你正在嘗試可能無法直接反正可能的節點。

根據不同的平臺上,你可能需要建立某種形式的自包含包,或者在您需要的計算節點上莫名其妙地作爲工作的啓動過程的一部分依賴拉。

0

不完全優雅,但一步就解決了問題。我使用相同的腳本發送qsub工作併爲給定路徑設置變量

#!/bin/bash 
# 
#$ -S /bin/bash 
#$ -V 
#$ -cwd 
#$ -N "Job" 

if [ -z ${var+x} ]; then 
    sPath="`dirname $0`" 
    qsub -o console.txt -e error.txt -v var=$sPath $0 >qsub.txt 
else 
    echo " Set variable: $var" 
fi