我正在编写一个脚本,以便在sge集群中通过qsub运行。
我有几个可执行文件需要在脚本中调用,它们都在同一位置(与脚本本身相同)。所以我想知道如何才能得到正在执行的脚本的位置。我有一个自动构建系统,对这个位置进行硬编码是不对的。代码应该类似
#!/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/default/spool/compute-2-8/job_scripts
BaseDir 0:/opt/gridgine/default/spool/compete-2-8/job_scripts/9534
SGE_ROOT:/opt/gridengine
SGE_job_spool_DIR:/opt/gradengine/default/spool/compute-2-8/active_jobs/9534.1
主要问题是sge实现将我的脚本复制到job_script中,因此我丢失了对原始脚本的引用。
我的猜测是qsub
将提交存储在一个单独的目录中,然后从那里运行它。到那时,原始队列条目的路径将丢失。如果需要将其包含在作业的元数据中,则只需将其作为参数传递即可。
提交目录通常不能保证对运行作业的节点可见,因此您尝试的内容可能无法直接实现。
根据平台的不同,您可能必须创建某种自包含的捆绑包,或者以某种方式在计算节点上引入所需的依赖项,作为作业启动处理的一部分。
虽然不完全优雅,但问题一步解决。我使用相同的脚本发送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