我正在编写一个脚本,通过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"
输出是:
目录SOURCE:/ opt / gridengine / default / spool / compute-2-8 / job_scripts
BaseDir 0:/ opt / gridengine / default / spool / compute-2-8 / job_scripts / 9534
SGE_ROOT:/ opt / gridengine
SGE_JOB_SPOOL_DIR:/opt/gridengine/default/spool/compute-2-8/active_jobs/9534.1
主要问题是sge实现将我的脚本复制到job_script中,所以我放弃了对原始脚本的引用。
答案 0 :(得分:0)
我的猜测是qsub
将提交存储在一个单独的目录中,然后从那里运行它。到那时,原始队列条目的路径将丢失。如果需要将其作为参数传递,您只需将其作为参数传递。
通常不保证提交目录对于运行作业的节点是可见的,因此无论如何您可能无法直接进行尝试。
根据平台的不同,您可能必须创建某种自包含的捆绑包,或者以某种方式在计算节点上提取所需的依赖项作为作业启动处理的一部分。
答案 1 :(得分: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