2016-06-09 2 views
2

Im пишу скрипт, который будет запускаться через qsub в кластере sge.sge получить расположение скрипта внутри скрипта

У меня есть несколько исполняемых файлов, которые мне нужно вызвать в скрипте, и все они находятся в одном месте (то же, что и сам скрипт). Итак, мне интересно, как я могу найти место выполнения сценария Im. У меня есть автоматическая система сборки, и это просто не так, чтобы жестко закодировать это местоположение. Код должен быть чем-то вроде

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

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

Я судимый несколько вещей, и они не работали и люди, отмеченные как дубликат. Ни одно из предыдущих решений не работало. Im работает с моим скриптом, используя 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:/OPT/gridengine/по умолчанию/катушка/вычислительно 2-8/job_scripts/9534
SGE_ROOT:/опт/gridengine
SGE_JOB_SPOOL_DIR:/OPT/gridengine/по умолчанию/катушка/вычислительно 2-8/active_jobs/9534.1

Основная проблема заключается в том, что sge i mplementation копирует мой скрипт в job_script, поэтому я теряю ссылку на исходный скрипт.

+4

Это? [Может ли сценарий Bash указать, в каком каталоге он хранится?] (Http://stackoverflow.com/q/59895/1983854) – fedorqui

+0

Я пробую это раньше, и похоже, что SGE выполняет мой скрипт через другой скрипт. Предположим, что я нашел свой скрипт в/tmp/qsubDir/при запуске этого решения я получаю: Directory SOURCE:/opt/gridengine/default/spool/compute-3-15/jobs_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